我通常要做的是验证从OpenID Connect提供程序(例如Google)获取的id_token值。令牌使用RSA算法签名,公钥从Discovery文档(参数为jwks_uri)中读取。例如,Google密钥以JWK格式here可用:
我将使用 RSACryptoServiceProvider 类来解码签名。为了初始化它,我必须提供 RSAParameters 的模数和指数值。这些值从上面的 JWK 中读取,分别对应 n 和 e。根据 规范,这些值是 Base64urlUInt 编码值:
{
kty: "RSA",
alg: "RS256",
use: "sig",
kid: "38d516cbe31d4345819b786d4d227e3075df02fc",
n: "4fQxF6dFabDqsz9a9-XgVhDaadTBO4yBZkpUyUKrS98ZtpKIQRMLoph3bK9Cua828wwDZ9HHhUxOcbcUiNDUbubtsDz1AirWpCVRRauxRdRInejbGSqHMbg1bxWYfquKKQwF7WnrrSbgdInUZPv5xcHEjQ6q_Kbcsts1Nnc__8YRdmIGrtdTAcm1Ga8LfwroeyiF-2xn0mtWDnU7rblQI4qaXCwM8Zm-lUrpSUkO6E1RTJ1L0vRx8ieyLLOBzJNwxpIBNFolMK8-DYXDSX0SdR7gslInKCn8Ihd9mpI2QBuT-KFUi88t8TW4LsoWHAwlgXCRGP5cYB4r30NQ1wMiuQ",
e: "AQAB"
}
我将使用 RSACryptoServiceProvider 类来解码签名。为了初始化它,我必须提供 RSAParameters 的模数和指数值。这些值从上面的 JWK 中读取,分别对应 n 和 e。根据 规范,这些值是 Base64urlUInt 编码值:
所以,我的问题是如何解码这些值以将它们放入RSAParameters中?我尝试将它们解码为常规的Base64url字符串(将正整数或零值表示为其无符号大端表示形式的八位序列的base64url编码。八位序列必须使用最少的八位字节来表示该值。零表示为 BASE64URL(单个零值八位字节),即“AA”。
Convert.FromBase64String(modulusRaw)
),但这显然行不通,并生成以下错误:输入不是有效的Base-64字符串,因为它包含一个非Base64字符,超过两个填充字符或在填充字符中有一个非法字符。
HttpServerUtility.UrlTokenDecode
在您的情况下不起作用吗? - Baldrick