ASP.NET Identity “角色-权限”管理 7

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。