我通常想做的是验证id_token从 OpenID Connect 提供商(例如 Google)获得的值。令牌使用 RSA 算法进行签名,公钥从发现 https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata文件(该jwks_uri范围)。例如,Google 密钥可用here https://www.googleapis.com/oauth2/v3/certsJWK 格式:
{
kty: "RSA",
alg: "RS256",
use: "sig",
kid: "38d516cbe31d4345819b786d4d227e3075df02fc",
n: "4fQxF6dFabDqsz9a9-XgVhDaadTBO4yBZkpUyUKrS98ZtpKIQRMLoph3bK9Cua828wwDZ9HHhUxOcbcUiNDUbubtsDz1AirWpCVRRauxRdRInejbGSqHMbg1bxWYfquKKQwF7WnrrSbgdInUZPv5xcHEjQ6q_Kbcsts1Nnc__8YRdmIGrtdTAcm1Ga8LfwroeyiF-2xn0mtWDnU7rblQI4qaXCwM8Zm-lUrpSUkO6E1RTJ1L0vRx8ieyLLOBzJNwxpIBNFolMK8-DYXDSX0SdR7gslInKCn8Ihd9mpI2QBuT-KFUi88t8TW4LsoWHAwlgXCRGP5cYB4r30NQ1wMiuQ",
e: "AQAB"
}
我将使用RSAC加密服务提供者 https://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider(v=vs.110).aspx用于解码签名的类。要初始化它,我必须提供RSA参数 https://msdn.microsoft.com/en-us/library/system.security.cryptography.rsaparameters(v=vs.110).aspx与模数和指数值。这些值是从上面的 JWK 中读取的n and e相应地。根据规格 https://www.rfc-editor.org/rfc/rfc7518#section-6.3.1.1,这些值是 Base64urlUInt 编码的值:
正整数或零整数值的表示形式
值的无符号大端表示的 base64url 编码
作为八位位组序列。八位位组序列必须使用最小的
表示该值所需的八位字节数。零表示
作为 BASE64URL(单个零值八位字节),即“AA”。
所以,我的问题是如何解码这些值以将它们放入 RSAParameters?我尝试将它们解码为常见的 Base64url 字符串(Convert.FromBase64String(modulusRaw)
),但这显然不起作用并生成此错误:
输入不是有效的 Base-64 字符串,因为它包含非 Base-64
字符、两个以上的填充字符或非法字符
填充字符之间。
RFC 7515 https://www.rfc-editor.org/rfc/rfc7515.txt定义base64url编码如下:
使用 URL 和文件名安全字符集的 Base64 编码
第 5 节中定义RFC 4648 http://www.rfc-editor.org/info/rfc4648,所有尾随“=”
省略字符(第 3.2 节允许)并且没有
包含任何换行符、空格或其他附加内容
人物。注意空八位组的base64url编码
序列是空字符串。 (有关注释,请参阅附录 C
实现无填充的 base64url 编码。)
RFC 4648 将“使用 URL 和文件名安全字母表的 Base 64 编码”定义为常规 base64,但是:
- 填充可以省略(就像这里一样)
- Using
-
代替+
and _
代替/
所以要使用常规的Convert.FromBase64String
,你只需要反转这个过程:
static byte[] FromBase64Url(string base64Url)
{
string padded = base64Url.Length % 4 == 0
? base64Url : base64Url + "====".Substring(base64Url.Length % 4);
string base64 = padded.Replace("_", "/")
.Replace("-", "+");
return Convert.FromBase64String(base64);
}
这段代码可能已经存在于框架中的某个地方,但我不知道。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)