【问题标题】:c# .Net Core 2.1 Authorize Attribute - Default Claimsc# .Net Core 2.1 授权属性 - 默认声明
【发布时间】:2020-01-30 21:52:07
【问题描述】:
当使用 [Authorize] 属性(不指定策略)时,有没有办法在默认策略上设置所需的声明?
关键是我希望它需要声明才能授权,但我不想为控制器明确设置策略。我宁愿只有 [Authorize] 而不是 [Authorize(Policy = "something")]
问这个问题的另一种方式是,是否可以在默认策略中添加声明?
在此先感谢您提出的任何想法和意见。
【问题讨论】:
标签:
c#
asp.net-core
asp.net-core-2.0
authorize-attribute
【解决方案1】:
您可以在启动时覆盖默认策略
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireClaim("CLAIM")
.Build();
});
另外,如果你想通过一些自定义策略进行授权并避免多次写入策略,你可以创建一个新的授权属性
public class AuthorizePolicyAttribute : AuthorizeAttribute
{
public AuthorizePolicyAttribute()
{
Policy = "CustomPolicy";
}
}
【解决方案2】:
为了防止误报错误(即您忘记将 [Authorize] 属性放在数百个操作方法或控制器之一中,并且熟练的黑客以某种方式到达了该端点),您还可以向控制器添加约定以便它们自动具有 [Authorize] 属性。如果您确实不需要某些操作方法或控制器的授权,则可以使用 [AllowAnonymous] 属性。
首先,您必须创建一个新的授权策略并将其添加到您的 Startup.cs 类中 ConfigureServices 方法下的服务中:
services.AddAuthorization(o => {
o.AddPolicy("authwithsomepolicy", p =>
{
p.RequireAuthenticatedUser();
p.RequireClaim("MYPOLICY");
});
});
然后您创建一个扩展 IControllerModelConvention 的新类,并为您的所有控制器实现该策略的自动化:
public class AddAuthorizeFilters : IControllerModelConvention
{
public void Apply(ControllerModel controller)
{
controller.Filters.Add(new AuthorizeFilter("authwithsomepolicy"));
}
}
最后,在您的 Startup.cs 类中,您可以将此约定添加到您的 Mvc 系统中(再次在 ConfigureServices 方法下):
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(setupAction =>
{
setupAction.Conventions.Add(new AddAuthorizeFilters ());
});
}