我已经在我的应用程序中添加了一个 JWT 中间件:
app.UseJwtBearerAuthentication(options => { options.AutomaticAuthenticate = true;} )
理想情况下,我想要实现的是默认情况下所有控制器操作都受到保护(以前的 ASP.NET 中有过滤器),如果我想要其他策略,我会将匿名放在我想要公开或授权("SomePolicy")的那些上,但我希望没有令牌,API 根本无法访问。如何在 ASP.NET 核心中执行此操作?
从.Net 6
开始,我们可以这样做(如果使用Microsoft推荐的最小托管模型):
app
.MapControllers()
.RequireAuthorization(); // This will set a default policy that says a user has to be authenticated
从.Net Core 3
开始,我们可以这样做:
app.UseEndpoints(endpoints =>
{
endpoints
.MapControllers()
.RequireAuthorization(); // This will set a default policy that says a user has to be authenticated
});
可以更改默认策略或添加新策略并使用它。
附言请注意,即使方法名称显示"授权",默认情况下也只要求用户经过身份验证。不过,可以添加更多策略来扩展验证。
您仍然可以使用筛选器,如以下示例所示:
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
此示例中的策略非常简单,但有很多方法可以为各种要求、角色等配置策略。
下面的示例在使用 .NET 5 时对我有用,接受的答案似乎不适用于 .NET 5
services.AddMvc(config => {
config.Filters.Add(new AuthorizeFilter());
});
有很多解决方案会告诉你其中的两个:-
//First one
builder.Services.AddControllers(opts =>
{
opts.Filters.Add(new AuthorizeFilter());
});
//Second one
builder.Services.AddAuthorization(opts =>
{
opts.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});