標籤:
1. 驗證管理
參考:認識ASP.NET MVC的5種AuthorizationFilter
ASP.NET MVC架構中已經提供了基於AOP驗證的機制與基本組件,重點是FilterAttribute。
1.1. 建立驗證Attribute
基本思路:父類驗證邏輯通過,再驗證目前使用者所屬角色是否具備存取權限。MVC已經有了一個許可權驗證實現AuthorizeAttribute,這裡只需要繼承該類,重寫相應方法,增加自訂驗證邏輯即可。
注意:屬性Roles和Users中的特定角色與使用者將不驗證存取權限。
public class IdentityAuthorizeAttribute : AuthorizeAttribute { /// <summary> /// 授權上下文 /// </summary> private AuthorizationContext _filterContext; #region 重寫父類方法 /// <summary> /// 重寫授權驗證方法 /// </summary> /// <param name="filterContext"></param> public override void OnAuthorization(AuthorizationContext filterContext) { _filterContext = filterContext; base.OnAuthorization(filterContext); } /// <summary> /// 重寫核心驗證方法 /// </summary> /// <param name="httpContext"></param> /// <returns></returns> protected override bool AuthorizeCore(HttpContextBase httpContext) { //取父類的驗證結果 var result = base.AuthorizeCore(httpContext); //如果驗證未通過,則調用訪問驗證邏輯 if (!result) { return HasPermission(_filterContext); } return result; } #endregion |
通過ActionDescriptor取請求資訊,驗證登入使用者是否具備許可權。
/// <summary> /// 當前請求是否具有存取權限 /// </summary> /// <param name="filterContext"></param> /// <returns></returns> private bool HasPermission(AuthorizationContext filterContext) { //取目前使用者的許可權 var rolePermissions = GetUserPermissions(filterContext.HttpContext); //待訪問的Action的Permission var action = new ApplicationPermission { Action = filterContext.ActionDescriptor.ActionName, Controller = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, Description = ActionPermissionService.GetDescription(filterContext.ActionDescriptor) }; //是否授權 return rolePermissions.Contains(action, new ApplicationPermissionEqualityComparer()); } |
1.2. 應用驗證特性
將該特性添加到Controller或Action上即可實現許可權驗證,為方便起見將IdentityAuthorize特性添加到BaseController,相應的Controller繼承該類。例中“管理員”角色將不驗證許可權。
[IdentityAuthorize(Roles="管理員")] public abstract class BaseController : Controller |
ASP.NET Identity “角色-許可權”管理 7