.NET 8 Clean Architecture下JWT签名验证失败求助
问题重现
调用带[Authorize]特性的接口时触发以下错误:
[13:57:08 INF] Failed to validate the token.
Microsoft.IdentityModel.Tokens.SecurityTokenSignatureKeyNotFoundException: IDX10500: Signature validation failed. No security keys were provided to validate the signature.
[13:57:08 INF] Bearer was not authenticated. Failure message: IDX10500: Signature validation failed. No security keys were provided to validate the signature.
问题根源
你的代码已实现JWT生成逻辑和配置类,但缺少认证服务的注册与启用步骤,ASP.NET Core无法加载你配置的JWT验证参数,导致签名验证时找不到密钥。
修复步骤
1. 完善Program.cs的认证服务注册
修改Program.cs,添加认证服务注册并启用JWT Bearer方案,同时确保中间件顺序正确:
var builder = WebApplication.CreateBuilder(args); // ... 其他服务注册 // 注册JWT配置类 builder.Services.ConfigureOptions<JwtOptionsSetup>(); builder.Services.AddTransient<IConfigureOptions<JwtBearerOptions>, JwtBearerOptionsSetup>(); // 新增:注册认证服务,指定JWT Bearer为默认方案 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(); // ... 其他配置和服务注册 // 新增:启用认证、授权中间件(顺序不可颠倒) app.UseAuthentication(); app.UseAuthorization(); app.Run();
注意:UseAuthentication必须在UseAuthorization之前,且位于UseRouting之后。
2. 验证配置文件的JWT节点正确性
确保appsettings.json(或对应环境配置文件)中存在格式正确的Jwt节点,且密钥长度符合HmacSha256要求(至少16字节):
"Jwt": { "Issuer": "MyIssuer", "Audience": "MyAudience", "SecretKey": "your_secure_secret_key_here_at_least_16_characters" }
3. 确认配置绑定有效性
在JwtBearerOptionsSetup中添加断点或日志,检查_options.SecretKey、Issuer、Audience是否正确从配置文件加载,避免出现空值或无效值。
4. 验证密钥一致性
确保Token生成时使用的_options.SecretKey与验证时的完全一致,编码方式统一使用Encoding.UTF8,避免编码差异导致密钥不匹配。
额外排查点
- 若使用Clean Architecture,确认配置类所在项目已被API项目引用,且配置文件的
Jwt节点无拼写错误。 - 用JWT解析工具检查示例Token的
iss、aud字段,确保与配置的Issuer、Audience完全匹配。
内容的提问来源于stack exchange,提问作者Szymon Jagaczewski

