System.IdentityModel.Tokens.Jwt库验证AAD id_token签名失败问题咨询
手动验证失败的核心原因
- 密钥类型不匹配
Azure AD签发的id_token采用RS256非对称签名算法,你用SymmetricSecurityKey(对称密钥类,仅适用于HS256等对称签名场景)来承载公钥,完全不符合验证逻辑,库在做签名校验时会因为密钥类型和算法不匹配直接失败。 - 密钥解析逻辑错误
x5c数组中存储的是X.509证书的Base64编码内容,你直接将PEM格式的证书字符串做UTF8编码转字节当作密钥值,没有正确解析证书提取RSA公钥,库拿到的是无效的密钥内容,自然无法完成签名校验。
正确的手动构造密钥验证代码示例
var kid = "l3sQ-50cCH4xBVZLHTGwnSR7680"; var idToken = "{id_token}"; var x5cBase64 = "{x5c[0]}"; // 直接用jwks接口返回的x5c数组第一个元素,不需要加PEM头尾 // 正确解析x5c为RSA公钥 byte[] certBytes = Convert.FromBase64String(x5cBase64); using var cert = new X509Certificate2(certBytes); var rsaPublicKey = cert.GetRSAPublicKey(); var signingKey = new RsaSecurityKey(rsaPublicKey) { KeyId = kid }; var handler = new JwtSecurityTokenHandler(); var tokenValidationParameters = new TokenValidationParameters() { IssuerSigningKey = signingKey, ValidateIssuerSigningKey = true, ValidateLifetime = false, ValidateAudience = false, ValidateIssuer = false }; try { var claimsPrincipal = handler.ValidateToken(idToken, tokenValidationParameters, out var validatedToken); Console.WriteLine($"{claimsPrincipal.Identity.Name}"); } catch (Exception ex) { Console.WriteLine(ex.Message); }
底层逻辑补充
你后续用OpenIdConnect配置管理器自动获取密钥能成功,本质是库内部已经帮你完成了x5c的解析、RSA公钥的构造、kid匹配的完整逻辑,拿到的config.SigningKeys已经是正确的RsaSecurityKey类型对象,和上面手动构造的最终密钥结构完全一致,所以能通过验证。
内容的提问来源于stack exchange,提问作者INNVTV
相关产品推荐
相关产品推荐

