c# - IssuerSigningKeyResolver 的有效委托
问题描述
我在设置 TokenValidation 参数时遇到问题。VS 告诉我,在“x.Id”处的 IssuerSigningKeyResolver 委托中, “'char' 不包含 'Id' 的定义”。
在这种情况下,“证书”被声明并加载了谷歌证书: -
Byte[][] certBytes = getCertBytes(GOOGLE_CERTS);
Dictionary<String, X509Certificate2> certificates = new Dictionary<String, X509Certificate2>();
for (int i = 0; i < certBytes.Length; i++)
{
X509Certificate2 certificate = new X509Certificate2(certBytes[i]);
certificates.Add(certificate.Thumbprint, certificate);
}
TokenValidationParameters JWTparams = new TokenValidationParameters()
{
ValidateActor = false,
ValidateAudience = true,
ValidAudience = CLIENT_ID,
ValidateIssuer = true,
ValidIssuers = VALID_ISSUERS,
ValidateIssuerSigningKey = true,
RequireSignedTokens = true,
IssuerSigningKeyResolver = (tokenString, securityToken, identifier, parameters) =>
{
return identifier.Select(x =>
{
if (certificates.ContainsKey(x.Id.ToUpper()))
{
return new X509SecurityKey(certificates[x.Id.ToUpper()]);
}
return null;
}).First(x => x != null);
},
ValidateLifetime = true
};
我绝不是 C# 的专家,所以我会感谢我复制的一些代码的帮助。我的“理解”是委托将“标识符”作为字符串接收,所以为什么使用 Linq.Select 我不确定,因为我猜它一次只会通过字符串一个字符?
文档说“标识符”可能为空,但“.First(x => x != null)”假设正在处理连续调用?
“securityToken”有一个 ID,但在其他任何地方都不合适。
请帮忙。
解决方案
看来这是一种有效且更具逻辑性/可读性的方法:-
IssuerSigningKeyResolver = (token, securityToken, kid, validationParameters) =>
{
return certificates
.Where(x => x.Key.ToUpper() == kid.ToUpper())
.Select(x => new X509SecurityKey(x.Value));
},
推荐阅读
- haskell - 在上下文之外结合可能、IO 和函数会导致错误
- c# - 备用行颜色 GroupedListview
- javascript - jsGantt改进的箭头突出显示
- java - 在java中只返回奇数(int)的方法
- webview - Flutter:如何在 Web 视图中启用手势?
- makefile - 如何通过qmake生成makefile并在没有Qt环境的情况下使用它
- varnish - Varnish 3:接受 JSON 返回 HTML
- typo3 - 在德国搜索好的 Typo3 培训课程
- apache-spark - Spark 创建的分区比 WholeTextFiles 上的 minPartitions 参数少
- node.js - NodeJS SyntaxError:位置 16 处的 JSON 中的意外字符串