.NET 7 Minimal API中JWT生成及验证失败问题求助
.NET 7 Minimal API JWT验证失败(401/Invalid Signature)排查方案
核心问题定位
你遇到的The signature key was not found和jwt.io显示的Invalid Signature,本质是JWT认证配置与令牌生成逻辑不匹配,以下是具体排查点和解决方法:
1. 认证配置未绑定签名密钥
你当前的AddJwtBearer()调用未传入任何配置参数,导致认证服务无法知晓验证签名所需的密钥,这是最常见的原因。
修复步骤:
- 确保
appsettings.json的JWT配置完整:"Jwt": { "SecretKey": "your-32-byte-minimum-secret-key-here", "Issuer": "your-app-issuer", "Audience": "your-app-audience" } - 修改认证配置,绑定令牌验证参数:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, // 与appsettings及令牌生成逻辑保持一致 ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"])) }; });
2. 令牌生成逻辑与认证配置参数不一致
如果生成JWT时使用的密钥、签发方(Issuer)、受众(Audience)与认证配置不匹配,会导致签名验证失败,且Payload中缺失关键信息。
正确的令牌生成示例:
app.MapPost("/token", (IConfiguration config) => { var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["Jwt:SecretKey"])); var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: config["Jwt:Issuer"], audience: config["Jwt:Audience"], expires: DateTime.UtcNow.AddHours(1), signingCredentials: signingCredentials ); return Results.Ok(new { Token = new JwtSecurityTokenHandler().WriteToken(token) }); });
- 必须确保
SecretKey、Issuer、Audience与认证配置完全一致 - 算法需匹配(示例用
HmacSha256,认证端默认也使用该算法)
3. 中间件顺序错误
Minimal API对中间件顺序敏感,认证和授权中间件必须在端点映射前注册:
// 先注册认证、授权中间件 app.UseAuthentication(); app.UseAuthorization(); // 再映射受保护端点 app.MapGet("/secret", () => "敏感内容") .RequireAuthorization();
如果中间件顺序颠倒,授权逻辑无法生效,会直接返回401。
4. 密钥长度不符合算法要求
若使用HmacSha256算法,密钥长度至少为32字节(256位),过短的密钥会导致签名无效。可以通过代码检查:
var keyBytes = Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"]); if (keyBytes.Length < 32) { // 更换为至少32字节的密钥,比如生成一个随机的256位密钥 }
内容的提问来源于stack exchange,提问作者user20081580
相关产品推荐
相关产品推荐

