ASP.NET Core使用JWT认证报invalid_token(audience为空)错误
JWT令牌校验失败修复方案
问题现象
使用生成的JWT令牌访问受保护API时,返回如下认证错误:
WWW-Authenticate: Bearer error="invalid_token", error_description="The audience 'empty' is invalid"
错误根因
报错核心原因是JWT校验规则与令牌生成逻辑不匹配:你在JWT认证配置中开启了受众校验(ValidateAudience = true),要求令牌必须携带合法的aud(受众)声明,但生成JWT令牌时未设置任何Audience值,校验阶段读取到的aud字段为空,直接判定令牌无效。
可选修复方式
你可以根据实际场景二选一:
方式1:关闭受众校验(适合本地开发测试场景)
直接修改ConfigureServices中的令牌校验参数,关闭受众校验,无需改动令牌生成代码:
var tokenValidationParameters = new TokenValidationParameters() { IssuerSigningKey = signingKey, ValidateIssuer = false, ValidateAudience = false, // 原代码此处为true,修改为false ClockSkew = TimeSpan.Zero };
方式2:保留受众校验(生产环境推荐)
如果需要开启受众校验,必须同时在服务配置和令牌生成代码中设置匹配的Audience值:
- 首先在JWT认证配置中指定合法的受众值:
var tokenValidationParameters = new TokenValidationParameters() { IssuerSigningKey = signingKey, ValidateIssuer = false, ValidateAudience = true, ValidAudience = "BikeStoreAPI", // 可自定义为你的API服务标识,测试场景可直接填项目名 ClockSkew = TimeSpan.Zero };
- 修改登录接口中的JWT生成逻辑,传入和配置一致的Audience参数:
var jwt = new JwtSecurityToken( audience: "BikeStoreAPI", // 和上面配置的ValidAudience值完全一致 claims: claims, signingCredentials: signingCredentials, expires: DateTime.Now.AddMinutes(30) );
其他配置优化建议
- 调整服务注册顺序:将
AddIdentity相关代码放到AddAuthentication的JWT配置之后,避免Identity默认的Cookie认证方案覆盖JWT认证配置,引发其他认证异常。 - 发起请求时确保请求头格式正确:
Authorization头的值格式为Bearer {你获取到的JWT令牌字符串},注意Bearer和令牌之间保留一个半角空格。
测试截图参考

内容的提问来源于stack exchange,提问作者Abhi Singh
相关产品推荐
相关产品推荐

