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