JSON Web令牌有效性验证在.NET Core上传递但在.NET 4.6.1上失败

时间:2017-11-14 20:51:11

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

我试图通过使用Microsoft.IdentityModel.Tokens库来改变.NET Core和.NET 4.6.1中JSON Web Token的有效性。我挖掘了源代码并注意到AsymmetricSignatureProvider以不同方式处理.NET Core和其他版本的方法bool Verify(byte[] input, byte[] signature)中的签名验证,这也是我的验证失败的地方。您可以在此link中找到源代码。

一般情况下,我首先下载JSON Web Key Sets,然后我正在构建安全密钥,最后我正在构建TokenValidationParameters并验证令牌。

我的代码从这里开始

下载JSON Web密钥集:

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

var jwks = new JsonWebKeySet(data);

这里我从JSON Web Key Sets构建安全密钥。请注意我如何解码指数和模数,可能是.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的有效性的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

感谢lovemathsbrentschmaltz

发生此行为是因为.net 4.6.1不会删除前导0x00。 Pull请求已经合并,它将在5.2.0版本中提供。

有关详细信息,请访问github上的issues