【发布时间】:2016-03-20 23:35:39
【问题描述】:
我通常尝试做的是验证从 OpenID Connect 提供商(例如 Google)获得的 id_token 值。令牌使用 RSA 算法签名,公钥从 Discovery 文档(jwks_uri 参数)中读取。例如,Google 密钥以 JWK 格式提供 here:
{
kty: "RSA",
alg: "RS256",
use: "sig",
kid: "38d516cbe31d4345819b786d4d227e3075df02fc",
n: "4fQxF6dFabDqsz9a9-XgVhDaadTBO4yBZkpUyUKrS98ZtpKIQRMLoph3bK9Cua828wwDZ9HHhUxOcbcUiNDUbubtsDz1AirWpCVRRauxRdRInejbGSqHMbg1bxWYfquKKQwF7WnrrSbgdInUZPv5xcHEjQ6q_Kbcsts1Nnc__8YRdmIGrtdTAcm1Ga8LfwroeyiF-2xn0mtWDnU7rblQI4qaXCwM8Zm-lUrpSUkO6E1RTJ1L0vRx8ieyLLOBzJNwxpIBNFolMK8-DYXDSX0SdR7gslInKCn8Ihd9mpI2QBuT-KFUi88t8TW4LsoWHAwlgXCRGP5cYB4r30NQ1wMiuQ",
e: "AQAB"
}
我将使用RSACryptoServiceProvider 类来解码签名。要初始化它,我必须为RSAParameters 提供模数和指数值。这些值从上述 JWK 中读取为对应的 n 和 e。根据specification,这些值是Base64urlUInt编码的值:
将正整数或零整数值表示为 值的无符号大端表示的 base64url 编码 作为八位字节序列。八位字节序列必须使用最小的 表示值所需的八位字节数。零表示 作为 BASE64URL(单个零值八位字节),即“AA”。
那么,我的问题是如何解码这些值以将它们放入 RSAParameters?我尝试将它们解码为常见的 Base64url 字符串 (Convert.FromBase64String(modulusRaw)),但这显然不起作用并生成此错误:
输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或非法字符 在填充字符之间。
【问题讨论】:
-
HttpServerUtility.UrlTokenDecode不适用于您的情况吗? -
@Baldrick 谢谢!但是,这在这种情况下不起作用。
标签: c# base64 rsa openid-connect jwk