自定义授权属性asp.net核心

时间:2019-05-29 23:16:03

标签: asp.net-core

我试图找出为我的asp.net核心应用程序创建自定义授权属性的最佳方法是什么。我看过这篇文章,并且知道这里讨论的两种方法。 How do you create a custom AuthorizeAttribute in ASP.NET Core?

1)使用IAuthorizationFilter

2)使用策略

我看到官方文档建议我们应该使用策略,而不是IAuthorizationFilter,但是我觉得在我的场景中使用策略实在是太过分了。我个人更喜欢IAuthorizationFilter方法。

我有一个非常基本的要求。我想为我的Web api创建一个authorize属性,如果当前用户未列入白名单以使用此API,则需要抛出403。我真的不在乎范围(canRead,canWrite,readWrite等)。如果我继续采用策略方法,那么我所有的API可能都使用相同的策略。 实现此目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

针对此类问题使用政策并不过分。您需要一个要求:

public class WhitelistRequirement: IAuthorizationRequirement
{
}

处理程序:

public class WhitelistHandler : AuthorizationHandler<WhitelistRequirement>
{

    // Implement a constructor to inject dependencies, such as your whitelist

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   WhitelistRequirement requirement)
    {
        if (isInWhitelist) // Your implementation here
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

同时在ConfigureServices中注册:

services.AddAuthorization(options =>
            options.AddPolicy("WhitelistPolicy",
            b => b.AddRequirements(new WhitelistRequirement())));

services.AddSingleton<IAuthorizationHandler, WhitelistHandler>();

然后使用您的政策:

[Authorize(Policy = "WhitelistPolicy")]

您可以使用全局过滤器在全球范围内应用该策略:

services.AddMvc(config =>
{
    var policy = new AuthorizationPolicyBuilder()
                     .AddRequirements(new WhitelistRequirement())
                     .Build();
    config.Filters.Add(new AuthorizeFilter(policy));
})

未经身份验证或禁止的用户产生的行为取决于应用程序的身份验证处理程序中“挑战”和“禁止”行为的实现。

请参见here