HttpContext.User.Identity.IsAuthenticated始终为false,根本原因是认证管道未正确挂载:AddJwtBearer必须链式调用在AddAuthentication之后,且TokenValidationParameters中ValidateIssuer、ValidateAudience、ValidateLifetime、ValidateIssuerSigningKey须显式设true,Issuer、Audience、SigningKey须严格匹配,同时UseAuthentication中间件必须启用并置于UseAuthorization之前。

HttpContext.User.Identity.IsAuthenticated 始终为 false?不是代码写错了,是认证管道根本没挂上。
为什么 AddJwtBearer 必须链在 AddAuthentication 后面
ASP.NET Core 的认证流程分两层:服务注册(AddAuthentication)和中间件执行(UseAuthentication)。AddJwtBearer不是独立中间件,而是向 AddAuthentication 注册的“验证方案”。如果单独调用 services.AddJwtBearer(),或写在 AddControllers() 之后,框架压根不知道该用什么逻辑解析 Authorization: Bearer xxx 头。
- 错误写法:
services.AddJwtBearer()单独一行,前面没AddAuthentication - 错误写法:
services.AddAuthentication().AddJwtBearer()写在AddControllers()后面 - 正确写法(必须在
builder.Services阶段):builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => { ... })
TokenValidationParameters 哪些字段必须显式设 true
.NET 6+ 中,ValidateIssuer、ValidateAudience、ValidateLifetime、ValidateIssuerSigningKey 默认全是 false。不显式设为 true,等于关掉了全部校验——过期 token、伪造 audience、无效签名全会通过。
-
ValidateIssuerSigningKey = true是最关键的开关,漏掉就无法验证签名 -
ValidIssuer和ValidAudience必须与生成 token 时传入的issuer、audience字符串**完全一致**(协议、末尾斜杠、大小写都不能差) -
ClockSkew = TimeSpan.Zero建议显式设置,避免服务器时钟偏差导致 token 异常失效
IssuerSigningKey 构造失败却无报错
IssuerSigningKey 必须是 SymmetricSecurityKey 实例,不能直接传字符串;且密钥长度必须 ≥ 32 字节(256 bit)。否则 SymmetricSecurityKey 构造会静默失败,后续所有验证都返回 false,IsAuthenticated 永远为 false,日志里还看不到任何异常。
- 错误写法:
new SymmetricSecurityKey(Encoding.UTF8.GetBytes("123"))(太短) - 正确写法:
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])),并确保配置项长度 ≥ 32 字符 - 别硬编码密钥,从
IConfiguration读取,方便不同环境切换
前端 Authorization 头格式不对也会 401
后端只负责生成纯 token 字符串,前端必须自己拼成标准格式:Authorization: Bearer <token>。如果前端传的是 Authorization: <token> 或 Authorization: Bearer<token>(少空格),后端解析时会报 Bearer error="invalid_token"——这不是 token 错,是头格式错。
- 登录接口返回时,只需返回
Ok(new { token = tokenString }),不要加 scheme - 前端存储 token 后,每次请求手动设置请求头:
headers: { 'Authorization': 'Bearer ' + token } - Swagger 或 Postman 测试时,务必在 Auth 标签页选 Bearer Token,别手输整个头
最常被忽略的其实是 issuer/audience 的字符串一致性——差一个斜杠、一个大写字母,IsAuthenticated 就是 false,而且没有任何提示。调试时先比对 token payload 里的 iss 和 aud 字段,再逐字核对 ValidIssuer 和 ValidAudience 配置值。


















