如何在 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());
});