.NET 7升级到.NET 9后JWT验证失败(IDX14100)求助
问题背景
升级到.NET 9后,JWT令牌被判定为无效,API持续返回401 - Unauthorized,错误信息如下:
IDX14100: JWT is not well formed, there are no dots (.).The token needs to be in JWS or JWE Compact Serialization Format.(JWS): 'EncodedHeader.EndcodedPayload.EncodedSignature'.(JWE): 'EncodedProtectedHeader.EncodedEncryptedKey.EncodedInitializationVector.EncodedCiphertext.EncodedAuthenticationTag'.
该问题仅在.NET 9环境出现,.NET 7下完全正常。
类似问题反馈
不少开发者在.NET 8/.NET 9升级过程中遇到过相同的JWT格式校验错误,核心原因是框架对JWT格式的校验逻辑变得更严格。
可能影响的.NET 9变更
- Microsoft.IdentityModel.Tokens库校验增强:.NET 9绑定的该库版本对JWT紧凑格式的校验更严格,之前.NET 7中允许的一些微小格式瑕疵(不影响解析的情况)现在会被直接判定为无效。
- JwtBearer中间件行为调整:.NET 9中JwtBearer认证中间件对Authorization头的解析逻辑优化,对令牌的格式完整性要求更高,不再容忍令牌中的额外转义字符、截断或无效空格。
排查与解决步骤
验证令牌格式完整性
提取请求中实际传递的JWT令牌,检查是否严格遵循Header.Payload.Signature(JWS)或JWE的5段式格式,确认令牌没有被URL编码错误、前端存储时的转义(如多余引号)或传输过程中截断。对比认证配置差异
检查.NET 7与.NET 9项目中的AddJwtBearer配置,确认是否存在.NET 9新增的校验选项,必要时显式配置兼容逻辑:builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "your-issuer", ValidAudience = "your-audience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key")) }; });检查令牌生成逻辑
确认后端生成JWT的代码在.NET 9环境下是否输出了正确格式的令牌,排查是否因依赖库升级导致生成的令牌编码方式或结构发生变化。排查前端令牌传递逻辑
验证前端在设置Authorization头时是否严格遵循Bearer <token>格式,避免在令牌前后添加多余的空格、引号或其他无效字符。
内容的提问来源于stack exchange,提问作者vijay sahu

