/// <summary>
/// 基本用戶身份驗證(各系統可根據自己的實際需要,自定義驗證方法,此多語言模塊實現了驗證並提供參考依據)
/// 詳細說明:判斷用戶是否登錄,如果未登錄則跳轉到統一登錄頁面
/// 其它:統一身份認證服務地址:http://218.201.35.212:11007/
/// 創建人:張甫軍 創建時間:2017年11月28日 16:24
/// </summary>
public class AuthAttribute : AuthorizeAttribute
{
/// <summary>
/// 自定義判斷當前用戶是否已授權
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//如果已授權,則返回true
if (httpContext.Request.IsAuthenticated)
{
return true;
}
else if (AuthorizedRequest(httpContext))//判斷是否已授權的請求(由統一登錄頁面授權成功后跳轉),如果已授權成功,則返回true
{
return true;
}
else
{
//未授權,設置狀態碼為403,並跳轉到統一登錄頁面
httpContext.Response.StatusCode = 403;
return false;
}
}
/// <summary>
/// 處理未經授權的請求
/// </summary>
/// <param name="filterContext"></param>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
//自定義403為未授權,如果狀態碼為403,就跳轉到統一登錄頁面
if (filterContext.HttpContext.Response.StatusCode == 403)
{
//判斷請求地址是否為空,顯然不能為空
if (filterContext.HttpContext.Request.Url != null)
{
//如果是ajax請求,則提示未登錄
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
var result = new JsonResult { Data = new CommonResultResponse { Result = false, Message = "請先登錄!" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
filterContext.Result = result;
}
else
{
//組裝參數,並跳轉到統一登錄頁面
//var loginUrl = "http://218.201.35.212:11007/Account/Login";
var loginUrlTest = "http://localhost:54550/Account/Login";
var appID = "IOV.Language";
var appSecret = "3r2d25fe3";
var returnUrl = filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.Url.ToString());
var redirectUrl = string.Concat(loginUrlTest, "?", "appId=" + appID, "&secret=" + appSecret, "&languageCulture=zh-CN", "&returnUrl=", returnUrl);
if (filterContext.HttpContext.Request.Url != null)
filterContext.Result = new RedirectResult(redirectUrl);
}
}
}
}
/// <summary>
/// 說明:此函數判斷是否為統一身份認證服務授權成功的回調。
/// 無論你的實現方式是什么,都應判斷當前請求是否有“accessToken”參數&是否有值,如有值,就意味着當前用戶登錄成功。
/// </summary>
/// <param name="httpContext">HTTP請求信息</param>
/// <returns>是否登錄成功</returns>
public bool AuthorizedRequest(HttpContextBase httpContext)
{
if (httpContext == null || httpContext.Request == null)
{
return false;
}
//訪問令牌(由統一身份認證服務頒發)
var accessToken = httpContext.Request.QueryString["accessToken"];
//當前登錄賬號
var loginID = httpContext.Request.QueryString["loginID"];
//判斷是否持有訪問令牌
if (string.IsNullOrWhiteSpace(accessToken))
{
return false;
}
else
{
return true;
}
}
}