.NET 7 JWT认证设置验证Bearer令牌失败原因解析
验证失败的核心原因
第一组设置报错The signature key was not found,本质是缺少JWT签名验证所需的密钥。ValidIssuer仅负责校验JWT令牌中的iss声明是否与指定值一致,但它不会告诉系统从哪里获取用于验证签名的公钥/密钥,因此令牌签名无法通过校验。
Authority与ValidIssuer的本质差异
1. ValidIssuer的作用
ValidIssuer是TokenValidationParameters中的一个属性,功能单一:
- 仅验证JWT的
iss(发行者)声明是否等于指定字符串 - 不涉及签名密钥的获取,也不会自动配置任何额外的验证逻辑
2. Authority的作用
Authority是JWT Bearer认证选项的顶级属性,它指向身份提供者(IdP)的元数据端点(通常是OIDC标准的.well-known/openid-configuration地址),具备以下核心能力:
- 自动获取签名密钥:系统会从Authority对应的元数据地址中拉取IdP的公钥,用于验证JWT的签名
- 自动配置ValidIssuer:默认会将
TokenValidationParameters.ValidIssuer设置为Authority对应的发行者值,无需手动指定 - 额外验证逻辑:还会自动处理诸如令牌过期、签名算法匹配等更多OIDC标准的验证规则
为什么仅保留Authority也能成功?
当设置Authority时,.NET的JWT认证中间件会自动完成以下操作:
- 从Authority地址获取IdP的元数据,包括发行者信息、签名密钥列表
- 自动将
TokenValidationParameters.ValidIssuer设置为元数据中的issuer值 - 配置签名密钥解析器,自动用获取到的公钥验证JWT签名
因此即使不手动设置ValidIssuer,中间件也会通过元数据自动完成发行者校验和签名验证,所以验证能成功。
补充说明
如果不想使用Authority(比如本地验证自定义JWT),可以手动在TokenValidationParameters中指定IssuerSigningKey或IssuerSigningKeys来提供签名密钥,示例如下:
builder.Services .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(x => { x.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = "some-issuer", ValidAudience = applicationOptions.Authentication.Audience, // 手动指定签名密钥 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-signing-key")) }; });
内容的提问来源于stack exchange,提问作者Learning AWS and PostgreSQL
相关产品推荐
相关产品推荐

