ASP.NET MVC 4 过滤器(Authorize)
Authorize特性類AuthorizeAttribute就稱作MVC的Filter,它在橫向為MVC框架擴展功能,讓我們可以更方便的處理日志、授權、緩存等而不影響縱向主體功能。
Authorization:實現IAuthorizationFilter接口,默認實現類AuthorizeAttribute,在調用Action方法前首先處理認證信息。
授權過濾器顧名思義就是授權用的,授權過濾器在方法執行之前執行,用于限制請求能不能進入這個方法,新建一個方法:
public JsonResult AuthorizeFilterTest()?
{ ?
??return Json(new ReturnModel_Common { msg = "hello world!" });
?}
直接訪問得到結果:
現在假設這個AuthorizeFilterTest方法是一個后臺方法,用戶必須得有一個有效的令牌(token)才能訪問,常規做法是在AuthorizeFilterTest方法里接收并驗證token,但是這樣一旦方法多了,每個方法里都寫驗證的代碼顯然不切實際,這個時候就要用到授權過濾器:
public class TokenValidateAttribute : AuthorizeAttribute
? ? {
? ? ? ? /// <summary>
? ? ? ? /// 授權驗證的邏輯處理。返回true則通過授權,false則相反
? ? ? ? /// </summary>
? ? ? ? /// <param name="httpContext"></param>
? ? ? ? /// <returns></returns>
? ? ? ? protected override bool AuthorizeCore(HttpContextBase httpContext)
? ? ? ? {
? ? ? ? ? ? string token = httpContext.Request["token"];
? ? ? ? ? ? if (string.IsNullOrEmpty(token))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return true;
? ? ? ? ? ? }
? ? ? ? }
? ? }
新建了一個繼承AuthorizeAttribute的類,并重寫了其中的AuthorizeCore方法,這段偽代碼實現的就是token有值即返回true,沒有則返回false,標注到需要授權才可以訪問的方法上面:
[TokenValidate]public JsonResult AuthorizeFilterTest()?
{ ? ?return Json(new ReturnModel_Common { msg = "hello world!" }) ?}
標注TokenValidate后,AuthorizeCore方法就在AuthorizeFilterTest之前執行,如果AuthorizeCore返回true,那么授權成功執行AuthorizeFilterTest里面的代碼,否則授權失敗。不傳token:
傳token:
不傳token授權失敗時進入了MVC默認的未授權頁面。這里做下改進:不管授權是成功還是失敗都保證返回值格式一致,方便前端處理,這個時候重寫AuthorizeAttribute類里的HandleUnauthorizedRequest方法即可:
/// <summary>
/// 授權失敗處理
/// </summary>
/// <param name="filterContext"></param>
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
? ? base.HandleUnauthorizedRequest(filterContext);
? ? var json = new JsonResult();
? ? json.Data = new ReturnModel_Common
? ? {
? ? ? ? success = false,
? ? ? ? code = ReturnCode_Interface.Token過期或錯誤,
? ? ? ? msg = "token expired or error"
? ? };
? ? json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
? ? filterContext.Result = json;
}
效果:
經驗:授權過濾器最廣泛的應用還是做權限管理系統,用戶登錄成功后服務端輸出一個加密的token,后續的請求都會帶上這個token,服務端在AuthorizeCore方法里解開token拿到用戶ID,根據用戶ID去數據庫里查是否有請求當前接口的權限,有就返回true,反之返回false。這種方式做授權,相比登錄成功給Cookie和Session的好處就是一個接口PC端、App端共同使用。
總結
以上是生活随笔為你收集整理的ASP.NET MVC 4 过滤器(Authorize)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java canvas 缩放图片_详解如
 - 下一篇: 华硕笔记本触摸板失灵