jwtbearer OnAuthenticationFailed在访问不被Authorize特性标记的action时也会触发,如何避免这种情况
时间: 2024-10-12 15:08:16 浏览: 23
Flask-Authorize:Flask的授权和访问控制
JWT Bearer验证在ASP.NET Core中,当`OnAuthenticationFailed`事件被触发时,通常是因为身份验证失败,例如JWT解析错误、过期或者是未经授权。如果你发现这个事件在尝试访问未使用`Authorize`特性的Action时也被触发,可能是由于默认的行为设置导致的。
为了避免这种情况,你可以采取以下措施:
1. **限制授权范围**:明确地将`Authorize`属性应用到那些需要验证的Controller或Action上,而不是全局启用。
```csharp
[Authorize(Roles = "admin")] // 或者其他你需要的角色
public class YourController : ControllerBase
{
[HttpGet]
public ActionResult YourAction()
{
// ...
}
}
```
2. **处理异常过滤器**:创建一个自定义的异常处理器,在这里你可以检查请求是否应该强制执行JWT验证。如果不是,你可以跳过身份验证过程。
```csharp
public class JwtBearerExceptionHandler : ExceptionHandlerOptions
{
public JwtBearerExceptionHandler(JwtBearerEvents events)
{
Events.OnChallenge += HandleChallenge;
}
private Task HandleChallenge(ExceptionContext context, string authenticationScheme)
{
if (!context.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: false))
{
// 如果Action不带AllowAnonymous,则继续验证
return Task.CompletedTask;
}
context.Result = Challenge(context.HttpContext.Request, authenticationScheme);
return Task.CompletedTask;
}
// ... 其他配置...
}
```
然后在`Startup.cs`中添加该处理器:
```csharp
services.AddAuthorization(options =>
{
options.AddPolicy("AllowAnonymous", policy => policy.Requirements.Add(newAllowAnonymousRequirement()));
});
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
// JWT配置...
})
.AddExceptionHandling(exceptionFilterOptions =>
{
exceptionFilterOptions.Filters.Add(new JwtBearerExceptionHandler());
});
```
通过这种方式,只有标注了`AllowAnonymous`的Action才会在无法成功验证JWT时返回401错误,而其他未标注的则会正常处理。
阅读全文