【问题标题】:Asp.Net Core: Access custom AuthorizeAttribute property in AuthorizeHandlerAsp.Net Core:在 AuthorizeHandler 中访问自定义 AuthorizeAttribute 属性
【发布时间】:2017-06-08 10:03:54
【问题描述】:

在处理Asp.Net core Authorization 部分时,我需要AuthorizeAttribute 中的一个新属性,我想将其用作额外的权限值。因此,我在自己的自定义 Authorize 属性中扩展了 AuthorizeAttribute。见下文:

public class RoleAuthorizeAttribute : Microsoft.AspNetCore.Authorization.AuthorizeAttribute
    {
        public string Permission { get; private set; }

        public RoleAuthorizeAttribute(string policy, string permission) : base(policy)
        {
            this.Permission = permission;
        }
    }

然后,我创建了一个AuthorizationHandler 来检查以下要求:

public class RolePermissionAccessRequirement : AuthorizationHandler<RolePermissionDb>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolePermissionDb requirement)
        {
            // check here..
            context.Succeed(requirement);

            return Task.FromResult(0);
        }
    }

各个服务集合映射我已经做过了,这里就省略了。

现在,我希望我的属性在控制器操作级别上像这样使用:

[RoleAuthorize("DefaultPolicy", "CustomPermission")]
public IActionResult List()
{
}

有人建议我如何访问在处理程序 RolePermissionAccessRequirement 中的 Action 方法顶部给出的权限属性值

我想根据 Action 方法顶部的Authorize attribute 中给出的自定义权限值执行某种访问规则。

提前致谢!

【问题讨论】:

    标签: c# asp.net-mvc authentication asp.net-core authorization


    【解决方案1】:

    要参数化自定义Authorize 属性,请创建一个实现IAsyncAuthorizationFilter 的授权过滤器。然后将过滤器包装在TypeFilterAttribute-derived 属性中。该属性可以接受参数并将其传递给授权过滤器的构造函数。

    使用示例:

    [AuthorizePermission(Permission.Foo, Permission.Bar)]
    public IActionResult Index()
    {
        return View();
    }
    

    实施:

    public class AuthorizePermissionAttribute : TypeFilterAttribute
    {
        public AuthorizePermissionAttribute(params Permission[] permissions)
            : base(typeof(PermissionFilter))
        {
            Arguments = new[] { new PermissionRequirement(permissions) };
            Order = Int32.MinValue;
        }
    }    
    
    public class PermissionFilter : Attribute, IAsyncAuthorizationFilter
    {
        private readonly IAuthorizationService _authService;
        private readonly PermissionRequirement _requirement;
    
        public PermissionFilter(
            IAuthorizationService authService, 
            PermissionRequirement requirement)
        {
            //you can inject dependencies via DI            
            _authService = authService;
    
            //the requirement contains permissions you set in attribute above
            //for example: Permission.Foo, Permission.Bar
            _requirement = requirement;
        }
    
        public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
        {
            bool ok = await _authService.AuthorizeAsync(
                context.HttpContext.User, null, _requirement);
    
            if (!ok) context.Result = new ChallengeResult();
        }
    } 
    

    另外,在DI中注册一个PermissionHandler,用权限列表处理PermissionRequirement

    public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
    

    查看这个this GitHub 项目以获得完整示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2018-04-13
      • 1970-01-01
      相关资源
      最近更新 更多