如何避免未被Authoriz特性的action触发jwtbearer的OnAuthenticationFailed事件
时间: 2024-10-12 17:07:21 浏览: 4
为了避免未授权的`Action`触发JWTBearer中间件的`OnAuthenticationFailed`事件,你需要在处理路由权限和验证访问控制时采取一些策略。以下是一些建议:
1. **路由装饰器**:使用特性或装饰器检查每个Action是否有足够的权限。例如,在ASP.NET Core中,你可以创建自定义的AuthorizeAttribute,只允许有特定角色或令牌权限的Action通过。
```csharp
[Authorize(JwtBearerDefaults.AuthenticationScheme)]
public class YourController : ControllerBase
{
// 只对有权限的Action开放
[HttpGet]
public IActionResult ProtectedAction()
{
return Ok();
}
}
```
2. **预检查**:在尝试访问Action之前,先检查当前请求的Token是否有效和权限足够。这通常在控制器或Action内部做。
3. **中间件过滤**:可以创建一个自定义中间件,在验证Token并解析出用户信息后,再进一步判断是否允许访问Action。如果权限不足,则在此处返回适当的错误响应,而不是让OnAuthenticationFailed事件触发。
4. **异常处理**:在OnAuthenticationFailed事件中添加条件逻辑,跳过无权访问的情况,避免公开敏感信息或执行后续操作。
```csharp
services.AddAuthorization(options =>
{
options.HandleProviderValidationFailure = context => true; // 关闭默认处理
});
services.AddAuthentication(options =>
{
// JWT配置...
})
.AddJwtBearer(options =>
{
options.Events.OnAuthenticationFailed += async context =>
{
if (!context.Principal.Identity.IsAuthenticated || !HasRequiredPermission(context.User, "ProtectedAction"))
{
context.Result = new UnauthorizedResult();
return;
}
await base.OnAuthenticationFailed(context);
};
});
```