首页 > 解决方案 > 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,但在其他任何地方都不合适。

请帮忙。

标签: c#.netlinqdelegates

解决方案


看来这是一种有效且更具逻辑性/可读性的方法:-

IssuerSigningKeyResolver = (token, securityToken, kid, validationParameters) =>
{
    return certificates
    .Where(x => x.Key.ToUpper() == kid.ToUpper())
    .Select(x => new X509SecurityKey(x.Value));
}, 

推荐阅读