【问题标题】:JSON Web Token validity verification passed on .NET Core but failed on .NET 4.6.1JSON Web 令牌有效性验证在 .NET Core 上通过但在 .NET 4.6.1 上失败
【发布时间】:2018-04-27 22:38:24
【问题描述】:

我正在尝试使用Microsoft.IdentityModel.Tokens 库来验证 .NET Core 和 .NET 4.6.1 中 JSON Web 令牌的有效性。我深入研究了源代码,发现AsymmetricSignatureProvider在.NET Core和其他版本的bool Verify(byte[] input, byte[] signature)方法中处理签名验证的方式不同,这也是我验证失败的地方。你可以在这个link找到源代码。

一般来说,我首先下载 JSON Web 密钥集,然后构建安全密钥,最后构建 TokenValidationParameters 并验证令牌。

我的代码从这里开始

下载 JSON Web 密钥集:

string data = null;
using (WebClient client = new WebClient())
{
    data = client.DownloadString(URL_TO_JWKS);
}

var jwks = new JsonWebKeySet(data);

在这里,我正在从 JSON Web 密钥集构建安全密钥。请注意我如何解码指数和模数,在 .NET 4.1.6 中可能是错误的:

    var keys = new List<SecurityKey>();
    foreach (var webKey in jwks.Keys)
    {
         var e = Base64UrlEncoder.DecodeBytes(webKey.E);
         var n = Base64UrlEncoder.DecodeBytes(webKey.N);
         var key = new RsaSecurityKey(new RSAParameters { Exponent = e, Modulus = n })
          {
             KeyId = webKey.Kid
          };

          keys.Add(key);
   }

这里我正在验证令牌:

var token = new JwtSecurityToken(tokenString);
ClaimsPrincipal claimsPrincipal = null;

            var parameters = new TokenValidationParameters()
            {
                ValidAudiences = token.Audiences,
                IssuerSigningKeys = keys,
                NameClaimType = nameClaimType ?? JwtRegisteredClaimNames.Sub,
                ValidIssuers = new[] { token.Issuer }
            };

            bool isValid = false;

            try
            {
                string jwt = token.RawData;
                SecurityToken securityToken = null;
                claimsPrincipal = new JwtSecurityTokenHandler().ValidateToken(jwt, parameters, out securityToken);
                isValid = claimsPrincipal.Identity.IsAuthenticated;
            }
            catch (SecurityTokenExpiredException)
            {
            }
            catch (SecurityTokenInvalidSignatureException ex)
            {
            }

验证 .NET 4.6.1 和 .NET Core 有效性的正确方法是什么?

【问题讨论】:

    标签: c# .net .net-core jwt


    【解决方案1】:

    感谢lovemathsbrentschmaltz

    发生此行为是因为 .net 4.6.1 未删除前导 0x00。拉取请求已经合并,它将在版本 5.2.0 中可用。

    更多详情请访问github上的issues

    【讨论】:

    • HS256 有相同问题的解决方案吗?
    猜你喜欢
    • 2019-09-05
    • 2017-08-20
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2017-06-22
    • 2020-02-04
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多