2013-07-16 11 views
11

Ich erhalte die folgende Fehlermeldung, wenn ich die JwtSecurityTokenHandler() ValidateToken() Funktion ausführen.JwtSecurityTokenHandler() ValidateToken() :: Signaturprüfung nicht bestanden hat ... sha256 in diesem Zusammenhang nicht unterstützt

Hier ist mein Pseudo-Code:

var jwtToken = {...} 
var tokenHandler = new JwtSecurityTokenHandler(); 
var validationParameters = new TokenValidationParameters {...}; 
var claimsPrincipal = tokenHandler.ValidateToken(jwtToken, validationParameters); 

Und hier ist der Fehler:

Jwt10316: Signature validation failed. Keys tried: 'System.IdentityModel.Tokens.X509AsymmetricSecurityKey'. 
Exceptions caught: 
'System.InvalidOperationException: Jwt10518: AsymmetricSecurityKey.GetHashAlgorithmForSignature('http://www.w3.org/2001/04/xmldsig-more#hmac-sha256') threw an exception. 
AsymmetricSecurityKey: 'System.IdentityModel.Tokens.X509AsymmetricSecurityKey' 
SignatureAlgorithm: 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256', check to make sure the SignatureAlgorithm is supported. 
Exception: 'System.NotSupportedException: Crypto algorithm 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256' not supported in this context. 
    at System.IdentityModel.Tokens.X509AsymmetricSecurityKey.GetHashAlgorithmForSignature(String algorithm) 
    at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(AsymmetricSecurityKey key, String algorithm, Boolean willCreateSignatures)'. 
---> System.NotSupportedException: Crypto algorithm 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256' not supported in this context. 
    at System.IdentityModel.Tokens.X509AsymmetricSecurityKey.GetHashAlgorithmForSignature(String algorithm) 
    at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(AsymmetricSecurityKey key, String algorithm, Boolean willCreateSignatures) 
    --- End of inner exception stack trace --- 
    at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(AsymmetricSecurityKey key, String algorithm, Boolean willCreateSignatures) 
    at System.IdentityModel.Tokens.SignatureProviderFactory.CreateProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures) 
    at System.IdentityModel.Tokens.SignatureProviderFactory.CreateForVerifying(SecurityKey key, String algorithm) 
    at System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateSignature(SecurityKey key, String algorithm, Byte[] encodedBytes, Byte[] signature) 
    at System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateSignature(JwtSecurityToken jwt, Byte[] signatureBytes, IEnumerable`1 signingTokens)'. 

System.NotSupportedException: Crypto-Algorithmus 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256

Der seltsame Teil ist, dass direkt hinter diesem Teil der Fehlermeldung sind die Ansprüche, die in das Token codiert wurden. Als Umgehung mache ich ein paar Textparsing und rekonstruiere mein ClaimsPrincipal, aber ich sollte das nicht tun müssen.

Irgendwelche Ideen, wie Sie die sha256 für diesen Kontext aktivieren können?

UPDATE: Da ich zu diesem Thema keine Bewegung hatte (abgesehen davon, dass ich ein Tumbleweed-Abzeichen erhalte), werde ich weitere Details hinzufügen. Vielleicht kann mir jemand helfen, das Problem zu lösen. Ich muss annehmen, dass, da niemand sonst dieses Problem erfährt, irgendwo ein Benutzerfehler meinerseits sein muss. Bitte sagen Sie mir, wenn etwas falsch klingt.

Meine Vermutung ist, dass, da wir jwt Validierung fehlschlagen, dann hat es vielleicht etwas mit dem Zertifikat auf der Validierungsmaschine/IDP zu tun.

  1. Ich erstellte ein sha256 Signing-Zertifikat für das IDP und legte es in die persönlichen Zertifikate auf dem IDP.
  2. Ich exportierte den öffentlichen Schlüssel dieses Zertifikats und legte es in den Cert-Ordner der vertrauenswürdigen Personen meiner Validierungsmaschine.
  3. ich den folgenden Code auf meinem Entwerter dann ausführen, nachdem ein Token von meinem idP Empfang:

Beispiel:

var jwtToken = response.AccessToken; 
var store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine); 
store.Open(OpenFlags.ReadOnly); 
X509Certificate2 cert = store.Certificates.Find(X509FindType.FindByThumbprint, "thinktecture identityserver 2.Configuration => Key Configuration => Signing Thumbprint>", false)[0]; 
store.Close(); 
var tokenHandler = new JwtSecurityTokenHandler(); 
var validationParameters = new TokenValidationParameters 
       { 
        AllowedAudience = "<thinktecture identityserver 2.Configuration => Relying Party => Realm/Scope Name>", 
        ValidIssuer = "<thinktecture identityserver 2.Configuration => General Configuration => Site ID>", 
        SigningToken = new X509SecurityToken(cert) 
       }; 

ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(jwtToken, validationParameters); 

Hinweis meine Verwendung der folgenden Platzhalter zeigt, wo die Daten sind besiedelt von:

  • thinktecture identityserver 2.Konfiguration => Key Konfiguration => Anmeldung Thumbprint
  • thinktecture identityserver 2.Konfiguration => Unter Berufung Partei => Realm/Scope-Name
  • thinktecture identityserver 2.Konfiguration => Allgemeine Konfiguration => Site ID

Gibt es alles, was man sehen kann dass ich in diesem Fall falsch liege?

UPDATE 2

ich in diesen Code lautete: http://pastebin.com/DvQz8vdb und nach meinem JWT der durch sie gab ich mir den gleichen Fehler: Im Grunde ist es sagen, es ist nur „RS256“ unterstützt „HS384“ oder „HS512 ". Vielleicht ist das mein Problem .. mein JWT kommt zurück HS256, nicht RS256 oder HS> 256 (384/512)

Wie kann ich den Signaturalgorithmus von HS256 auf HS512 umstellen?

Und an dieser Stelle denke ich, wir sind zurück zum Identity Server Problem?

Antwort

1

Ich kann endlich Schluss machen. Es scheint, dass das Signatur-Cert mit dem JWT im oAuth2-Protokoll unter IdentityServer eigentlich nichts zu tun hat. Egal welches cert ich benutzt habe, ich habe den Fehler bekommen.

Ich habe das Problem gelöst, indem ich den Symmetric Signing Key zur Validierung des JWT verwendet habe, nicht das Signaturzertifikat, das im Abschnitt "Key Configuration" von IdentityServer gefunden wurde.

+6

Ich suche zum Beispiel für die Validierung eines JWT mit einem Symmetric Signing Key. Haben Sie ein Beispiel dafür, wie Sie dies im Code tun können? – Brett

+0

Hier ist ein Arbeitsbeispiel zur Überprüfung eines JWT mit einem Symmetric Signing Key anstelle eines Zertifikats https://Stackoverflow.com/a/25376518/383807 – Andy

2

Ich bin zufällig in diesen alten Post gelaufen, aber da ich vor fast einem Jahr ein ähnliches Problem hatte, werde ich meine Ergebnisse von damals erwähnen. Grundsätzlich besteht die Möglichkeit, IdSrv V2 für die Verwendung des Signaturzertifikats zu erzwingen, um sicherzustellen, dass für die vertrauende Partei kein symmetrischer Signaturschlüssel definiert ist. Solange es definiert ist, wird immer der symmetrische Signaturschlüssel verwendet. Siehe meine blog post für weitere Details.

Hope this helfen kann andere enden hier oben :-)

0

Ich weiß, dass dies eine alte Frage, aber ich habe in das exakt gleiche Problem laufen, aber ein connect issue in Bezug auf eine Race-Bedingung innerhalb CrptoHelper.GetIdentityFromConfig gefunden, die ist, was das Problem verursacht

Verwandte Themen