.NET JWT开启ValidateIssuer和ValidateAudience后授权失败问题求助
问题根因
你开启ValidateIssuer、ValidateAudience校验后,JWT中间件会强制校验请求携带的Token中iss(签发人)、aud(受众)两个声明与服务端配置的合法值是否匹配。但你当前的Token生成逻辑中,构造SecurityTokenDescriptor时未指定Issuer和Audience属性,生成的Token本身不携带这两个声明,自然无法通过校验,最终返回401未授权。
修复步骤
- 新增JWT配置项
在你的应用配置文件(如appsettings.json)中新增签发人和受众的配置,示例如下:
{ "TokenKey": "你原有配置的加密密钥", "Jwt:Issuer": "https://localhost:5001", // 替换为你实际的服务端地址 "Jwt:Audience": "HeroMainApiClient" // 替换为你实际的业务客户端标识 }
- 修改Token生成逻辑
更新TokenService代码,生成Token时携带签发人和受众声明:
首先修改TokenService的构造函数,保存配置实例:
private readonly SymmetricSecurityKey _key; private readonly UserManager<AppUser> _userManager; private readonly IConfiguration _config; // 新增配置字段 public TokenService(IConfiguration config, UserManager<AppUser> userManager) { _config = config; // 保存配置实例 _userManager = userManager; _key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["TokenKey"])); }
之后在CreateToken方法的SecurityTokenDescriptor中新增Issuer、Audience赋值:
var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims), Expires = DateTime.Now.AddDays(7), SigningCredentials = creds, // 新增以下两行 Issuer = _config["Jwt:Issuer"], Audience = _config["Jwt:Audience"] };
- 完善JWT校验配置
在注入JWT认证服务的代码中,补充合法的签发人、受众配置:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["TokenKey"])), ValidateIssuer = true, ValidIssuer = config["Jwt:Issuer"], // 新增合法签发人配置 ValidateAudience = true, ValidAudience = config["Jwt:Audience"], // 新增合法受众配置 }; });
注意事项
修复完成后需要重新登录获取新生成的Token,此前生成的老Token由于缺失iss、aud字段,调用接口依然会返回401。
内容的提问来源于stack exchange,提问作者AnonyXplorer
相关产品推荐
相关产品推荐

