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

.NET Core 3.1 Web API JWT认证报401 invalid_token问题

.NET Core 3.1 JWT认证返回401 invalid_token排查与修复

按出现概率从高到低排查,不需要无目的地试错:

  • 首先核对中间件注册顺序
    不要主观判定自己顺序写对了,直接打开Startup.Configure方法确认,两个认证相关中间件必须严格按以下顺序注册,顺序调换会直接导致认证流程不执行:
    // 先认证,后授权,顺序不能换
    app.UseAuthentication();
    app.UseAuthorization();
    
  • 逐字段对齐令牌生成与验证的参数
    这是90%此类问题的根因,逐项核对以下点:
    1. 签名密钥一致性:生成令牌和验证令牌时使用的密钥字符串必须完全一致,不要带多余空格、换行、转义符;编码方式统一用Encoding.UTF8.GetBytes(),不要一边用UTF8转字节,另一边用Base64解码;注意对称签名密钥长度不能低于16个字符(128位),过短的密钥会直接导致签名验证失败;签名算法保持一致,统一用SecurityAlgorithms.HmacSha256即可。
    2. 签发者(iss)、受众(aud)完全匹配:逐字符对比两边的字符串,注意大小写、末尾斜杠、http/https协议差异,比如生成时用https://localhost:5001,验证时多写了末尾斜杠,就会校验失败。
    3. 时间逻辑校验:你已经设置ClockSkew = TimeSpan.Zero,没有宽限时间,此时JWT的exp字段必须是UTC时间戳。如果生成令牌时用DateTime.Now.AddMinutes(过期时长),东八区环境下生成的令牌会比实际UTC时间早8小时,刚签发就会判定为过期,必须改成DateTime.UtcNow.AddMinutes(过期时长)。
  • 开启认证日志定位精确错误
    不需要靠猜,直接调整日志级别输出认证流程的详细错误:
    在appsettings.json中添加以下配置:
    "Logging": {
      "LogLevel": {
        "Default": "Information",
        "Microsoft.AspNetCore.Authentication": "Debug"
      }
    }
    
    重启服务后再次请求受保护接口,控制台会明确打印验证失败的具体原因,包括签名不匹配、受众不匹配、令牌过期等,直接定位根因。
  • 核对客户端传参格式
    确认请求头中Authorization字段格式为Bearer <令牌字符串>,Bearer和令牌之间仅保留一个空格,不要加多余引号、逗号;Postman/Insomnia中直接选Bearer Token类型填入令牌即可,不要手动重复添加Authorization头导致格式冲突。
  • 排除自定义逻辑干扰
    如果在JWT配置中添加了OnMessageReceived、OnTokenValidated、OnChallenge等自定义事件,先全部注释掉,排除自定义代码抛异常导致验证中断的情况。

快速校验小技巧:把生成的JWT做base64解码(不需要验证签名),直接看payload里的iss、aud、exp字段值,和配置的验证参数做比对,先排除字段值错误的低级问题。

内容的提问来源于stack exchange,提问作者danyolgiax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:54:18