标签:
参考:认识ASP.NET MVC的5种AuthorizationFilter
ASP.NET MVC框架中已经提供了基于AOP验证的机制与基本部件,重点是FilterAttribute。
基本思路:父类验证逻辑通过,再验证当前用户所属角色是否具备访问权限。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()); } |
将该特性添加到Controller或Action上即可实现权限验证,为方便起见将IdentityAuthorize特性添加到BaseController,相应的Controller继承该类。例中“管理员”角色将不验证权限。
[IdentityAuthorize(Roles="管理员")] public abstract class BaseController : Controller |
标签:
原文地址:http://www.cnblogs.com/mlemon/p/4304591.html