c# - Asp.Net 核心 : Access custom AuthorizeAttribute property in AuthorizeHandler

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

因为我正在处理 Asp.Net core Authorization部分,我需要在 AuthorizeAttribute 中的新属性我想将其用作额外的权限值。所以,我扩展了 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);
        }
    }

所有相应的服务集合映射我已经做过了,这里就省略了。

现在,我希望我的属性在 Controller 操作级别上像这样使用:
[RoleAuthorize("DefaultPolicy", "CustomPermission")]
public IActionResult List()
{
}

有没有人推荐我我将如何访问处理程序 RolePermissionAccessRequirement 中 Action 方法顶部给出的权限属性值??

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

提前致谢!

最佳答案

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

用法示例:

[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();
    }
} 

另外,注册一个PermissionHandler在 DI 中处理 PermissionRequirement有权限列表:
public class PermissionHandler : AuthorizationHandler<PermissionRequirement>

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

关于c# - Asp.Net 核心 : Access custom AuthorizeAttribute property in AuthorizeHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44432674/

相关文章:

asp.net-mvc - 我想调试(在其中设置断点)System.Web.Mvc.DefaultControllerFactory,这可能吗?

node.js - Passport 的路由文件问题

WordPress 和 JWT 以及自定义 API Rest 端点

c# - 在不检查 C# 中的扩展名的情况下检测文件是否为 CSV

c# - ASP .NET Core 路由到外部程序集中的 Controller

javascript - 单击html中的链接没有给出响应

laravel - OAuth2 密码授予混淆

c# - C# 中是否可以将服务结果自动转换为相同类型?

c# - LLBLGen : How can I softdelete a entry

c# - Xamarin.IOS : Cannot Resolve Reference (System. 线程.Tasks.Extension.dll)