zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    BIOS详解:什么是BIOS ?BIOS的作用?CMOS及其与BIOS的关系?
    随机数不随机
    解决hexo神烦的DTraceProviderBindings MODULE_NOT_FOUND
    保护模式特权级别DPL,RPL,CPL 之间的联系和区别
    Linux内核 hlist_head/hlist_node结构解析
    x86中的页表结构和页表项格式
    Linux下/proc目录简介
    bdev文件系统
    X86 IO端口和MMIO
    Mac OS Alfred 2 tips
  • 原文地址:https://www.cnblogs.com/mlemon/p/4304591.html
Copyright © 2011-2022 走看看