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.
- Ich erstellte ein sha256 Signing-Zertifikat für das IDP und legte es in die persönlichen Zertifikate auf dem IDP.
- Ich exportierte den öffentlichen Schlüssel dieses Zertifikats und legte es in den Cert-Ordner der vertrauenswürdigen Personen meiner Validierungsmaschine.
- 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?
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
Hier ist ein Arbeitsbeispiel zur Überprüfung eines JWT mit einem Symmetric Signing Key anstelle eines Zertifikats https://Stackoverflow.com/a/25376518/383807 – Andy