2016-05-31 22 views
1

Ich habe eine ASP.NET 5/Core RC1 MVC (WebApi) -Anwendung, die Schnittstelle mit Auth0 für Bearer-Authentifizierung mit JWT-Tokens ist. Die Anwendung verwendet dnx451 als Framework (nicht CoreCLR wegen nicht unterstützter Abhängigkeiten).TypeLoadException mit AsymmetricSignatureProvider im Zusammenhang mit JWT-Authentifizierung

Beim Ausführen der Anwendung unter Windows funktioniert es einwandfrei. Allerdings möchte ich es auf Ubuntu mit Mono als Laufzeit für dnx451 ausführen. Dort läuft die App aber sobald ich eine Anfrage an sie mache, kommt sie mit Internal Server Error 500 zurück.

Die Protokollausgabe:

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 

Ist dies eine allgemeine Unverträglichkeit mit Mono/ASP.NET 5 oder gibt es etwas dagegen zu tun?

+0

Welche Version von Ubuntu und welche Version von Mono verwenden Sie? – user1623521

+0

'Mono JIT Compiler Version 4.2.3 (Stable 4.2.3.4/832de4b)' und 'Ubuntu 14.04.4 LTS' – valorl

+0

Wie haben Sie solch ein modernes Mono in solch einer alten Distribution installiert? – user1623521

Antwort

1

Das Problem tritt nur weil AsymmetricSignatureProvider Fenster Rangier hat und geladen wird, auch wenn Sie eine SymmetricSecurityKey verwenden. Wenn Sie glücklich sind, hier ein SymmetricSecurityKey zu verwenden, ist eine Abhilfe:

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()}'."); 
    } 
} 

Dies ist identisch mit dem RC2 Build von Microsoft.IdentityModel.Tokens mit Ausnahme der auf Kommentar Abschnitte, die keine Funktion haben wenn Sie keine AsymmetricSecurityKey verwenden.

net45x ist die einzige Option, da dnx gelöscht wurde und verschiedene Treiber noch nicht für viele Monate auf coreclr zielen.