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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:27:02