You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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字符转换,得到错误的密钥字节数组,导致验证失败——这种情况在升级后也可能触发更严格的校验报错。

修复步骤

  1. 检查并调整密钥长度

    • 确认JWT Token使用的签名算法,对应密钥长度要求:
      • HS256:≥32字节(256位)
      • HS384:≥48字节(384位)
      • HS512:≥64字节(512位)
    • 若现有密钥长度不足,生成符合要求的密钥(例如随机生成32字节以上的字符串,或Base64编码的对应长度字节数据)。
  2. 修正密钥转换方式

    • 如果配置中的密钥是Base64编码格式,替换Encoding.UTF8.GetBytes()为Convert.FromBase64String():
      // Program.cs中修改
      var base64Key = appBuilder.Configuration.GetSection("JwtBearerTokenSignatureKey").Value;
      appBuilder.Services.AddAuthentication(Convert.FromBase64String(base64Key))
      
  3. 明确指定验证算法

    • 确保Token签名算法与验证配置一致,可在TokenValidationParameters中显式声明:
      jwtOptions.TokenValidationParameters = new TokenValidationParameters
      {
          // ...其他配置
          ValidAlgorithms = new[] { SecurityAlgorithms.HmacSha256 } // 匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:43:14