• 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

  • 相关阅读:
    JVM学习笔记之认识JDK(一)
    C#发送邮件异常:根据验证过程,远程证书无效
    windows下使用mysql双机热备功能
    批处理实现mysql的备份
    WebApi FormData+文件长传 异步+同步实现
    Oracle中已知字段名查询所在的表名
    mstsc遇到CredSSP加密Oracle修正
    使用subgit进行svn迁移至git(branch,tags)
    使用guava进行对字符串的加锁
    使用spring-data-solr做solr客户端
  • 原文地址:https://www.cnblogs.com/mlemon/p/4304591.html
Copyright © 2020-2023  润新知