2016-05-31 2 views
1

JWT 토큰을 사용하여 무기 인증을 위해 auth0와 인터페이스하는 ASP.NET 5/Core RC1 MVC (WebApi) 애플리케이션이 있습니다. 응용 프로그램은 dnx451을 프레임 워크로 사용합니다 (지원되지 않는 종속성 때문에 CoreCLR이 아님).JWT 인증과 관련된 AsymmetricSignatureProvider가있는 TypeLoadException

Windows에서 응용 프로그램을 실행할 때 완벽하게 작동합니다. 그러나 우분투에서 Mono를 런타임으로 사용하여 dnx451을 실행하고 싶습니다. 앱이 실행되지만 요청을 받으면 Internal Server Error 500과 함께 반환됩니다.

로그 출력 :

info: Microsoft.AspNet.Hosting.Internal.HostingEngine[3] 
     Request finished in 0.0006ms 500 
fail: Microsoft.AspNet.Server.Kestrel[13] 
     An unhandled exception was thrown by the application. 
     System.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10503: Signature validation failed. Keys tried: 'System.IdentityModel.Tokens.X509SecurityKey , KeyId: MTZBREFEQ0M5NUQ2RDY3RDkzM0E0RDYwMDdCM0I4QUY1MDc3RUNDNA 
     '. 
     Exceptions caught: 
     'System.TypeLoadException: Could not load type 'System.IdentityModel.Tokens.AsymmetricSignatureProvider' from assembly 'System.IdentityModel.Tokens, Version=5.0.0.112, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. 
     at System.IdentityModel.Tokens.SignatureProviderFactory.CreateForVerifying (System.IdentityModel.Tokens.SecurityKey key, System.String algorithm) <0x4067def0 + 0x0001b> in <filename unknown>:0 
     at System.IdentityModel.Tokens.X509SecurityKey.GetSignatureProvider (System.String algorithm, Boolean verifyOnly) <0x4067de30 + 0x00057> in <filename unknown>:0 
     at System.IdentityModel.Tokens.SecurityKey.GetSignatureProviderForValidating (System.String algorithm) <0x4067de00 + 0x0001a> in <filename unknown>:0 
     at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (System.Byte[] encodedBytes, System.Byte[] signature, System.IdentityModel.Tokens.SecurityKey key, System.String algorithm) <0x4067dcb0 + 0x0003f> in <filename unknown>:0 
     at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (System.String token, System.IdentityModel.Tokens.TokenValidationParameters validationParameters) <0x40679070 + 0x004b3> in <filename unknown>:0 
     '. 
     token: '{"alg":"RS256","typ":"JWT","kid":"MTZBREFEQ0M5NUQ2RDY3RDkzM0E0RDYwMDdCM0I4QUY1MDc3RUNDNA"}.{"iss":"**********","sub":"*****************","aud":"****************","exp":1464737848,"iat":1464701848}' 
     at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (System.String token, System.IdentityModel.Tokens.TokenValidationParameters validationParameters) <0x40679070 + 0x0096b> in <filename unknown>:0 
     at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken (System.String token, System.IdentityModel.Tokens.TokenValidationParameters validationParameters, System.IdentityModel.Tokens.SecurityToken& validatedToken) <0x406782f0 + 0x0021d> in <filename unknown>:0 
     at Microsoft.AspNet.Authentication.JwtBearer.JwtBearerHandler+<HandleAuthenticateAsync>d__1.MoveNext() <0x41f5bcf0 + 0x011c4> in <filename unknown>:0 

이 모노/ASP.NET 5 일반적인 호환성인가 또는 그것에 대해 할 수 있나요?

+0

어떤 버전의 우분투 및 어떤 버전의 모노를 사용하고 있습니까? – user1623521

+0

'Mono JIT 컴파일러 버전 4.2.3 (안정판 4.2.3.4/832de4b)'및'Ubuntu 14.04.4 LTS' – valorl

+0

그런 오래된 배포판에 어떻게 그런 모던 모노를 설치 했습니까? – user1623521

답변

1

SymmetricSecurityKey을 사용하는 경우에도 AsymmetricSignatureProvider에는 마샬링 창이 있기 때문에 문제가 발생합니다.

signingKey.CryptoProviderFactory = new MonoFriendlyCryptoProviderFactory(_LoggerFactory.CreateLogger<MonoFriendlyCryptoProviderFactory>()); 


public class MonoFriendlyCryptoProviderFactory : CryptoProviderFactory 
{ 
    private readonly ILogger _Logger; 

    public MonoFriendlyCryptoProviderFactory(ILogger logger) 
    { 
     _Logger = logger; 
    } 

    public override SignatureProvider CreateForSigning(SecurityKey key, string algorithm) 
    { 
     return CreateProvider(key, algorithm, true); 
    } 

    public override SignatureProvider CreateForVerifying(SecurityKey key, string algorithm) 
    { 
     return CreateProvider(key, algorithm, false); 
    } 

    private SignatureProvider CreateProvider(SecurityKey key, string algorithm, bool willCreateSignatures) 
    { 
     _Logger?.LogDebug($"Creating {algorithm} provider for {key.KeyId} for {(willCreateSignatures ? "signing" : "verifying")}"); 
     if (key == null) 
      throw new ArgumentNullException(nameof(key)); 
     if (string.IsNullOrWhiteSpace(algorithm)) 
      throw new ArgumentNullException(nameof(algorithm)); 

     //AsymmetricSecurityKey asymmetricSecurityKey = key as AsymmetricSecurityKey; 
     //if (asymmetricSecurityKey != null) 
     // return new AsymmetricSignatureProvider(asymmetricSecurityKey, algorithm, willCreateSignatures, this.AsymmetricAlgorithmResolver); 
     SymmetricSecurityKey symmetricSecurityKey = key as SymmetricSecurityKey; 
     if (symmetricSecurityKey != null) 
      return new SymmetricSignatureProvider(symmetricSecurityKey, algorithm); 
     JsonWebKey jsonWebKey = key as JsonWebKey; 
     if (jsonWebKey != null && jsonWebKey.Kty != null) 
     { 
      //if (jsonWebKey.Kty == "RSA" || jsonWebKey.Kty == "EC") 
      // return new AsymmetricSignatureProvider(key, algorithm, willCreateSignatures, this.AsymmetricAlgorithmResolver); 
      if (jsonWebKey.Kty == "oct") 
       return new SymmetricSignatureProvider(key, algorithm); 
     } 
     throw new ArgumentException($"{typeof(SignatureProvider)} supports: '{typeof(SecurityKey)}' of types: '{typeof(AsymmetricSecurityKey)}' or '{typeof(AsymmetricSecurityKey)}'. SecurityKey received was of type: '{key.GetType()}'."); 
    } 
} 

이 당신이 AsymmetricSecurityKey를 사용하지 않는 경우에는 기능 이없는 주석 부분을 제외하고 Microsoft.IdentityModel.Tokens의 RC2 빌드와 동일합니다 : 당신이 여기 SymmetricSecurityKey 사용하는 것이 행복 경우 해결 방법입니다.

net45x은 dnx가 삭제되고 여러 드라이버가 여러 달 동안 coreclr을 아직 타겟팅하지 않기 때문에 유일한 옵션입니다.