c# .Net Core 2.1 授权属性 - 默认声明

c# .Net Core 2.1 Authorize Attribute - Default Claims

使用 [Authorize] 属性(未指定策略)时,有没有办法在默认策略上设置必需的声明?

关键是我希望它需要一个授权声明,但我不想必须明确地为控制器设置策略。我宁愿只 [Authorize] 而不是 [Authorize(Policy = "something")]

另一种提问方式是,是否可以向默认策略添加声明?

提前感谢您提出任何想法和意见。

您可以在启动时覆盖默认策略

services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
                                      .RequireClaim("CLAIM")
                                      .Build();
});

此外,如果您想通过一些自定义策略进行授权并避免多次编写该策略,您可以创建一个新的授权属性

public class AuthorizePolicyAttribute : AuthorizeAttribute
{
    public AuthorizePolicyAttribute()
    {
        Policy = "CustomPolicy";
    }
}

为了防止误报错误(即您忘记将 [Authorize] 属性放入数百个操作方法或控制器中的一个,并且熟练的黑客以某种方式到达了那个端点)您还可以添加一个约定您的控制器,以便它们自动具有 [Authorize] 属性。如果你真的不需要某些操作方法或控制器的授权,那么你可以使用 [AllowAnonymous] 属性。

首先,您必须创建一个新的授权策略,并将其添加到您的 Startup.cs class 中的 ConfigureServices 方法下的服务中:

services.AddAuthorization(o => {    
    o.AddPolicy("authwithsomepolicy", p =>
    {
        p.RequireAuthenticatedUser();
        p.RequireClaim("MYPOLICY");
    }); 
});

然后您创建一个新的 class 来扩展 IControllerModelConvention 并为您的所有控制器实现该策略的自动化:

public class AddAuthorizeFilters : IControllerModelConvention
{
    public void Apply(ControllerModel controller)
    {
        controller.Filters.Add(new AuthorizeFilter("authwithsomepolicy"));            
    }
}

最后,在您的 Startup.cs class 中,您可以将此约定添加到您的 Mvc 系统(同样在 ConfigureServices 方法下):

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(setupAction =>
    {
        setupAction.Conventions.Add(new AddAuthorizeFilters ());
    });
}