繁体   English   中英

Asp.Net Core:访问AuthorizeHandler中的自定义AuthorizeAttribute属性

[英]Asp.Net Core: Access custom AuthorizeAttribute property in AuthorizeHandler

当我在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给出的自定义权限值来执行某种访问规则。

提前致谢!

要参数化自定义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>

看看这个 GitHub项目的完整示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM