如何设置jwtbearer只对Authoriz特性标记的action执行鉴权,其他情况下都不执行任何鉴权操作
时间: 2024-10-12 09:07:37 浏览: 23
为了在.NET Core中仅针对那些已使用`Authorize`特性标记的Action执行JWT Bearer鉴权,而对其他未标记的Action不执行鉴权,你需要调整认证服务和授权中间件的配置。以下是步骤:
1. **注册认证服务**:
首先,确保你在Startup.cs文件中添加了JWT Bearer认证服务,并设置`HandleProviderValidationFailure`属性为`false`,因为默认情况下它会处理验证失败,导致所有Action都经过鉴权。
```csharp
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = ... // 设置你的验证规则
options.Events OnAuthenticationFailed = async context =>
{ // 自定义事件处理
if (context.ActionDescriptor IsDefined AuthorizeAttribute)
{
await base.OnAuthenticationFailed(context);
}
else
{
context.Fail("No authorization required for this action.");
}
};
});
```
这里,`IsDefined`应该改为实际的方法,比如`TryGetFromAttributes<T>`,如果你使用的是Microsoft.AspNetCore.Authorization。
2. **授权中间件配置**:
可以通过`UseEndpoints`方法,将`AllowAnonymous`属性应用于整个应用程序或部分路径,这样未标记`Authorize`的Action将不会执行鉴权中间件。
```csharp
app.UseRouting();
app.UseAuthorization(); // 放在最前面,确保所有未经标记的Action都被匿名
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers()
.RequireAuthorization(JwtBearerDefaults.AuthenticationScheme) // 只对标注Authorize的Controller作用
.MapBlazorHub()
.MapFallbackToPage("/_Host");
endpoints.MapRazorPages().AllowAnonymous(); // 对于静态页面,允许匿名访问
});
```
这样,只有使用了`Authorize`特性的Action才会执行JWT Bearer的鉴权流程,其余未标记的Action则会被视为无需鉴权。
阅读全文