升级Microsoft.AspNetCore.Authentication.JwtBearer至7.0.15后请求全401排查
问题原因及解决方案
核心问题
升级至7.0.15及更高版本的Microsoft.AspNetCore.Authentication.JwtBearer后,中间件开始严格遵循JWT签名算法的密钥长度规范,而你的配置中使用的签名密钥不符合对应算法的长度要求,导致Token验证失败返回401。
具体细节:
- 若使用默认的HS256签名算法,要求对称密钥长度至少为256位(32字节);
- 你的代码通过
Encoding.UTF8.GetBytes(配置字符串)生成密钥字节数组,如果配置的字符串转成UTF8后长度不足32字节,7.0.14版本未严格校验这一点,而7.0.15+版本开始强制执行该规范,因此出现"signature key was not found"错误。
另外一种常见错误场景:若配置中存储的是Base64编码的密钥字符串,使用Encoding.UTF8.GetBytes()会将Base64字符串本身作为UTF8字符转换,得到错误的密钥字节数组,导致验证失败——这种情况在升级后也可能触发更严格的校验报错。
修复步骤
检查并调整密钥长度
- 确认JWT Token使用的签名算法,对应密钥长度要求:
- HS256:≥32字节(256位)
- HS384:≥48字节(384位)
- HS512:≥64字节(512位)
- 若现有密钥长度不足,生成符合要求的密钥(例如随机生成32字节以上的字符串,或Base64编码的对应长度字节数据)。
- 确认JWT Token使用的签名算法,对应密钥长度要求:
修正密钥转换方式
- 如果配置中的密钥是Base64编码格式,替换
Encoding.UTF8.GetBytes()为Convert.FromBase64String():// Program.cs中修改 var base64Key = appBuilder.Configuration.GetSection("JwtBearerTokenSignatureKey").Value; appBuilder.Services.AddAuthentication(Convert.FromBase64String(base64Key))
- 如果配置中的密钥是Base64编码格式,替换
明确指定验证算法
- 确保Token签名算法与验证配置一致,可在
TokenValidationParameters中显式声明:jwtOptions.TokenValidationParameters = new TokenValidationParameters { // ...其他配置 ValidAlgorithms = new[] { SecurityAlgorithms.HmacSha256 } // 匹配Token使用的算法 };
- 确保Token签名算法与验证配置一致,可在
额外校验(可选)
可以在扩展方法中添加密钥长度校验,提前发现问题:
public static AuthenticationBuilder AddAuthentication(this IServiceCollection services, byte[] signingKey) { // 针对HS256算法校验密钥长度 if (signingKey.Length < 32) { throw new ArgumentException("HS256算法要求密钥长度至少32字节", nameof(signingKey)); } // ...原有配置代码 }
内容的提问来源于stack exchange,提问作者Kvam
相关产品推荐
相关产品推荐

