如何避免未被Authoriz特性标记的action仍然能触发jwtbearer的OnAuthenticationFailed事件
时间: 2024-10-12 14:07:50 浏览: 18
为了避免未被`Authorize`特性标记的Action触发JWT Bearer的`OnAuthenticationFailed`事件,你需要在处理事件的地方添加一个检查条件,确认该Action是否确实需要鉴权。以下是一个示例:
```csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = ...;
options.Events = new JwtBearerEvents
{
OnAuthenticationFailed = async context =>
{
ActionDescriptor descriptor = context.HttpContext.GetRouteValues()?.FirstOrDefault(a => a.Key == "action")?.Value as ActionDescriptor; // 获取Action描述符
if (!descriptor?.Attributes.Any(attribute => attribute is AuthorizeAttribute) ?? false)
{
// 如果Action没有Authorize特性,则跳过处理
context.Response.StatusCode = StatusCodes.Status401Unauthorized; // 返回无权限错误
context.HandleResponse();
return;
}
// 如果有Authorize特性,则按照正常流程处理
await base.OnAuthenticationFailed(context);
},
};
});
}
```
这里我们首先尝试从请求的路由信息中获取Action的描述符,并检查其是否有`AuthorizeAttribute`。如果没有,我们将直接返回一个401 Unauthorized错误响应并结束处理。
阅读全文