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

使用Azure Key Vault验证第三方签发的JWT始终失败如何排查

问题原因及修复方案

核心错误点

  • 校验签名的原始输入错误:RS256算法对JWT签名的对象是Base64Url(Header).Base64Url(Payload)的拼接字符串的UTF8字节,当前代码仅对Payload单独做哈希,完全不符合JWT签名规则。
  • Base64编解码规则用错:JWT所有分段使用的是Base64Url编码,而非标准Base64,除补等号外,还需要将-替换为+、_替换为/才能正常解码。
  • 签名段处理错误:JWT第三段是Base64Url编码后的签名字节,直接对该字符串做UTF8编码得到的是编码字符串的字节,而非原始签名字节,需要先解码才能传入校验接口。

修复后可用代码

var client = new CryptographyClient(new Uri(myKeyVaultAddress), clientSecretCredential);
var jwtByParts = jwt.Split(".");
if (jwtByParts.Length != 3) throw new ArgumentException("无效JWT格式");

// 取Header和Payload的拼接字符串作为签名原始输入
var dataToSign = Encoding.UTF8.GetBytes($"{jwtByParts[0]}.{jwtByParts[1]}");
// 计算SHA256哈希
var digest = SHA256.Create().ComputeHash(dataToSign);

// 处理签名段的Base64Url编码,转原始签名字节
var signatureRaw = jwtByParts[2].Replace('-', '+').Replace('_', '/');
signatureRaw = signatureRaw.PadRight(signatureRaw.Length + (4 - signatureRaw.Length % 4) % 4, '=');
var signature = Convert.FromBase64String(signatureRaw);

var res = await client.VerifyAsync(SignatureAlgorithm.RS256, digest, signature);

额外校验项

运行修复后代码如果仍报错,可依次确认:

  1. 导入Azure Key Vault的是对应证书的公钥部分
  2. Key Vault的访问策略中给当前服务主体开放了密钥的验证操作权限

内容的提问来源于stack exchange,提问作者Leonardo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:45:03