2017-11-14 1 views
3

Microsoft.IdentityModel.Tokensライブラリを使用して、.NET Coreと.NET 4.6.1の両方でJSON Webトークンのバリデーションを試みています。私はソースコードを掘り出して、AsymmetricSignatureProviderが.NETコアのメソッドbool Verify(byte[] input, byte[] signature)と他のバージョンの署名検証を異なる方法で処理することに気付きました。これは私の検証が失敗した場所です。このlinkにソースコードがあります。.NET CoreでJSON Webトークンの妥当性検証が成功しましたが、.NET 4.6.1で失敗しました

一般に私は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); 
    } 

ここで私は、トークンを検証しています:両方の.NET用の妥当性を検証するための正しい方法である

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) 
      { 
      } 

何4.6.1と.NETコア?

答えて

1

lovemathsbrentschmaltzのおかげで

この現象は、.net 4.6.1が先頭の0x00を削除しないために発生しました。プルリクエストはすでにマージされており、バージョン5.2.0で利用可能になります。

詳細については、githubのissuesをご覧ください。

関連する問題