使用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);
额外校验项
运行修复后代码如果仍报错,可依次确认:
- 导入Azure Key Vault的是对应证书的公钥部分
- Key Vault的访问策略中给当前服务主体开放了密钥的验证操作权限
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

