如何在 ASP.NET Core 中默认使用不记名令牌保护所有控制器?
How to protect all controllers by default with bearer token in ASP.NET Core?
我已将 JWT 中间件添加到我的应用程序中:
app.UseJwtBearerAuthentication(options => { options.AutomaticAuthenticate = true;} )
不,有趣的是,它会为所有操作抛出 500 异常(在以后的版本中应更改为 401),即使是那些根本不受保护的操作(没有授权属性)。在我看来,这是错误的,但也许我自己做错了什么。
理想情况下,我想要实现的是默认情况下所有操作都受到保护(在之前的 ASP.NET 中有过滤器),我会把匿名放在我想要的那些上 public 或也许 Authorize("SomePolicy") 如果我想要额外的政策,但我希望没有令牌根本无法访问 API 。我如何在新的 ASP.NET 中执行此操作(我知道我可以从具有此属性的某些控制器继承,但我希望有更好的方法来执行此操作)?
您仍然可以像本例中那样使用过滤器:
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
此示例中的策略非常简单,但是有很多方法可以针对各种要求、角色等配置策略。
从 .Net 6
开始,我们可以这样做(如果使用 Microsoft 推荐的最小托管模型):
app.MapControllers().RequireAuthorization();
从 .Net Core 3
开始,我们可以这样做:
app.UseEndpoints(endpoints =>
{
endpoints
.MapControllers()
.RequireAuthorization(); // This will set a default policy that says a user has to be authenticated
});
可以更改默认策略或添加新策略并使用它。
P.S。请注意,即使方法名称显示为“授权”,默认情况下它只要求用户通过身份验证。不过,可以添加更多策略来扩展验证。
以下示例在使用 .NET 5 时对我有用,接受的答案似乎不适用于 .NET 5
services.AddMvc(config => {
config.Filters.Add(new AuthorizeFilter());
});
我已将 JWT 中间件添加到我的应用程序中:
app.UseJwtBearerAuthentication(options => { options.AutomaticAuthenticate = true;} )
不,有趣的是,它会为所有操作抛出 500 异常(在以后的版本中应更改为 401),即使是那些根本不受保护的操作(没有授权属性)。在我看来,这是错误的,但也许我自己做错了什么。
理想情况下,我想要实现的是默认情况下所有操作都受到保护(在之前的 ASP.NET 中有过滤器),我会把匿名放在我想要的那些上 public 或也许 Authorize("SomePolicy") 如果我想要额外的政策,但我希望没有令牌根本无法访问 API 。我如何在新的 ASP.NET 中执行此操作(我知道我可以从具有此属性的某些控制器继承,但我希望有更好的方法来执行此操作)?
您仍然可以像本例中那样使用过滤器:
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
此示例中的策略非常简单,但是有很多方法可以针对各种要求、角色等配置策略。
从 .Net 6
开始,我们可以这样做(如果使用 Microsoft 推荐的最小托管模型):
app.MapControllers().RequireAuthorization();
从 .Net Core 3
开始,我们可以这样做:
app.UseEndpoints(endpoints =>
{
endpoints
.MapControllers()
.RequireAuthorization(); // This will set a default policy that says a user has to be authenticated
});
可以更改默认策略或添加新策略并使用它。
P.S。请注意,即使方法名称显示为“授权”,默认情况下它只要求用户通过身份验证。不过,可以添加更多策略来扩展验证。
以下示例在使用 .NET 5 时对我有用,接受的答案似乎不适用于 .NET 5
services.AddMvc(config => {
config.Filters.Add(new AuthorizeFilter());
});