asp.net core中JwtBearerEvents中几个事件的生命周期

在 ASP.NET Core 的 JWT Bearer 认证中,JwtBearerEvents 提供了一系列事件钩子,允许你在认证流程的不同阶段插入自定义逻辑。以下是主要事件的生命周期顺序及其作用:

一、事件触发顺序(生命周期)

1. OnMessageReceived - 最先触发

csharp 复制代码
// 在收到请求时触发,用于自定义令牌提取逻辑
OnMessageReceived = context =>
{
// 1. 可以从查询字符串、Cookie等非标准位置提取令牌
var token = context.Request.Query["access_token"];
if (!string.IsNullOrEmpty(token))
context.Token = token;

return Task.CompletedTask;
}

触发时机 :收到请求后,验证令牌之前
用途:自定义令牌的获取方式(默认从 Authorization Header 获取)

2. OnTokenValidated - 令牌验证成功后

csharp 复制代码
// 令牌验证通过后触发,可以添加额外的验证逻辑
OnTokenValidated = context =>
{
// 2. 验证通过,可以:
// - 添加自定义声明
// - 检查用户状态(如是否被禁用)
// - 记录日志
var userId = context.Principal.FindFirstValue(ClaimTypes.NameIdentifier);
// 执行额外的业务验证...

return Task.CompletedTask;
}

触发时机 :JWT 签名、有效期等基本验证通过后
用途:添加业务层面的验证逻辑

3. OnAuthenticationFailed - 认证失败时

csharp 复制代码
// 认证失败时触发(如令牌过期、签名无效)
OnAuthenticationFailed = context =>
{
// 3. 处理认证失败
if (context.Exception is SecurityTokenExpiredException)
{
context.Response.Headers.Add("Token-Expired", "true");
}
return Task.CompletedTask;
}

触发时机 :令牌验证失败时(过期、无效签名等)
用途:处理认证失败,自定义错误响应

4. OnChallenge - 质询时触发(返回401)

csharp 复制代码
// 当需要质询客户端(返回401)时触发
OnChallenge = context =>
{
// 4. 自定义质询响应
context.Response.StatusCode = 401;
context.Response.ContentType = "application/json";
return context.Response.WriteAsync(
JsonSerializer.Serialize(new { error = "需要认证" }));
}

触发时机 :需要质询客户端提供凭证时(通常在 [Authorize] 属性触发)
用途:自定义401响应的格式

5. OnForbidden - 禁止访问时(返回403)

csharp 复制代码
// 认证成功但授权失败时触发
OnForbidden = context =>
{
// 5. 自定义403响应
context.Response.StatusCode = 403;
return context.Response.WriteAsync("权限不足");
}

触发时机 :认证成功但授权失败(如角色/策略不匹配)
用途:自定义403响应

二、完整生命周期流程图

复制代码
请求到达
↓
[OnMessageReceived] ← 提取令牌
↓
JWT验证(签名、有效期等)
├── 成功 → [OnTokenValidated] → 认证成功
└── 失败 → [OnAuthenticationFailed] → 认证失败
↓
授权检查
├── 需要认证但未提供 → [OnChallenge](返回401)
├── 认证成功但权限不足 → [OnForbidden](返回403)
└── 认证授权都成功 → 继续管道

三、实际使用示例

csharp 复制代码
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
// 标准验证参数...
};

options.Events = new JwtBearerEvents
{
OnMessageReceived = async context => { /* 1 */ },
OnTokenValidated = async context => { /* 2 */ },
OnAuthenticationFailed = async context => { /* 3 */ },
OnChallenge = async context => { /* 4 */ },
OnForbidden = async context => { /* 5 */ }
};
});

四、重要注意事项

  1. 异步处理 :所有事件都是异步的,需要返回 Task
  2. 短路请求 :在事件中可以通过 context.Fail() 或直接设置响应来终止请求
  3. 性能考虑 :在 OnTokenValidated 中避免耗时的数据库查询
  4. 错误处理 :在 OnAuthenticationFailed 中不要泄露敏感信息
  5. 事件顺序:理解事件顺序有助于正确放置业务逻辑

这些事件提供了灵活的扩展点,可以让你在不修改核心认证逻辑的情况下,实现各种定制需求。

相关推荐
网硕互联的小客服6 小时前
Linux服务器磁盘应该如何合理分区?
linux·运维·服务器
EatFan6 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
lisanmengmeng6 小时前
nacos nrpe 监控机及被监控机部署
服务器·nacos·nagios·nrpe
Maiko Star7 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
2301_808414388 小时前
Linux中动静态库的理解
linux·运维·服务器
现任明教教主~9 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
一条破秋裤9 小时前
Linux 线程创建:pthread_create 与基本回收
java·linux·运维
布吉岛的石头9 小时前
Java 程序员第 49 阶段5:BERT 预训练目标 MLM+NSP 的工程含义
java·人工智能·深度学习·bert·transformer
可涵不会debug10 小时前
第一次学 LangGraph:用一个快递案例搞懂 State、Node、Edge 和 compile
服务器·数据库·mysql
摇滚侠10 小时前
《On Java 中文版 基础卷》阅读笔记 对象无处不在 03
java·笔记·python