SecurityTokenSignatureKeyNotFoundexception bei der überprüfung von JWT Signatur
Ich versuche zu implementieren, die den OpenID Connect-Spezifikationen für meine organisation. Ich bin mit Microsofts OWIN-Implementierung von OpenID Connect in einem test relying party-Anwendung, um zu überprüfen, meine Implementierung des Protokolls.
Habe ich ausgesetzt, die folgende Metadaten-Dokument:
{
"issuer": "https://acs.contoso.com/",
"authorization_endpoint": "http://localhost:53615/oauth2/auth",
"token_endpoint": "http://localhost:53615/oauth2/token",
"userinfo_endpoint": "http://localhost:53615/connect/userinfo",
"jwks_uri": "http://localhost:53615/connect/keys",
"ui_locales_supported": [
"en-GB"
]
}
Den Signaturschlüssel ausgesetzt ist, wie dieses Dokument:
{
"keys": [
{
"n": "xpXxl3M-YkZlzQJdArO1TfOGT2no-UL4dbZ7WuSCNIsSfyGDaqUXjMMHNyq9yD3vp-NCyk8kmn7d5XqHufnceXJM8q4xTrhN3lvywdBSbR-dwXsA-B-MJVgfiK0d_z-mxP9ew2Hj9-KkWbWCzsswlWp3gZ4mB4RGutB1IRSzXVIbvZ-MtKUb6XUDU4LDb_c1xCEXWZxhR-o1a1dLfObH2hHJ-w5y6odGlKtOFx4i4h0u7-Oj5R6k5b2YXEHM0IuYeN0u0sQvrTecokntGzPrvhnKy69I7Z_az5rC5kgloh25D9lTbe4vcRU7FXlYCFYDZsT0_IkGIXRi7brOS4f1ow",
"e": "AQAB",
"kty": "RSA",
"use": "sig",
"alg": "RS256",
"kid": "F8A59280B3D13777CC7541B3218480984F421450"
}
]
}
Die Identität token erzeugt wird, über die JwtSecurityToken
Klasse und die dazugehörige Prozedur, mit der X509SigningCredentials
Klasse. Dieser code ist repräsentativ, wie das token ist so aufgebaut und zurückgegeben an die aufrufende system als parameter der response-Daten.
var credentials = new X509SigningCredentials(cert); //My certificate.
var issuedTime = DateTime.UtcNow;
var expiresTime = issuedTime.AddMinutes(5);
var epoch = new DateTime(1970, 01, 01, 0, 0, 0);
var claims = new[]
{
new Claim("sub", Guid.NewGuid().ToString()),
new Claim("iat" Math.Floor((issuedTime - epoch).TotalSeconds).ToString()),
new Claim("nonce", nonce), //Value from client
}
var token = new JwtSecurityToken(
"https://acs.contoso.com",
client_id, //Value from client
claims,
new Lifetime(issuedTime, expiresTime),
credentials);
var handler = new JwtSecurityTokenHandler();
parameters.Add("id_token", handler.WriteToken(token)); //Outgoing parameters.
Wenn ich Versuch zu passieren, das signierte token an die relying party-Anwendung, die OWIN-middleware übernimmt die POST und versucht zu überprüfen, die Signatur des Tokens. Dabei wird die folgende Ausnahme ausgelöst:
SecurityTokenSignatureKeyNotFoundexception: IDX10500: Unterschrift
die Validierung fehlgeschlagen ist. Nicht lösen SecurityKeyIdentifier:
'SecurityKeyIdentifier ( IsReadOnly = False, Count = 1, Ziffer[0] =
X509ThumbprintKeyIdentifierClause(Hash =
0xF8A59280B3D13777CC7541B3218480984f421450) ) ', token:
'{"typ":"JWT","alg":"RS256","x5t":"-KWSgLPRN3fMdUGzIYSAmE9CFFA"}.{"iss":"https://test.accesscontrol.net/","aud":"test","nbf":1404917162,"exp":1404917462,"sub":"60eb55ec-0699-4068-bfa6-41666fc2b2e9","iat":"1404917162"}
RawData:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1niising1dci6ii1lv1nntfbstjnmtwrvr3pjwvnbbuu5q0zgqsj9.eyJpc3MiOiJodHRwczovL2Fjcy5zdXJly2xvdwquy29tlyisimf1zci6inrlc3qilcjuymyioje0mdq5mtcxnjisimv4cci6mtqwndkxnzq2miwic3viijoinjblyju1zwmtmdy5os00mdy4lwjmytytnde2njzmyzjimmu5iiwiawf0ijoimtqwndkxnze2mij9.xkP0RwlX3CYfU0KhFsVvLJC94WK22DTqntm71cfjij8vuhv3b2yhdqfq70n8mqeyir8vtr6oqqno6uqxqx4rxus6zkfk9liv3n9nhcs97wjhp2jfefjyescytrmwcnnwssl7vkm2jxqfwkoqtnogp-ba04TtI6jVrjhOQXH43eCJ9vNuBUzdD-t8CAdmnbvH0nWpIB8kWbw5v8Sa0aQuxMjjyblc_2iw3x13dqnyvjp4fa7esb8n7c1it0keb-VKfUqiGD3VecyEZGGZbaGE8rvVet5QrY1lj3v4ym8j6-xDc5Yndc4swOun0L3D6TYk-8gdVXUJDRjbv1ZuhZltsw'.
Die Komponente ist noch pre-release, so kann dies ein Fehler in der Implementierung, jedoch möchte ich annehmen, dass es mein Fehler ist, bis alle Möglichkeiten ausgeschlossen ist.
Gibt es irgendetwas, was ich Tue, und das ist offensichtlich falsch, oder gibt es etwas, was ich tun sollte, genau zu verstehen, warum die Signatur nicht validiert werden?
InformationsquelleAutor Paul Turner | 2014-07-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist eingebettet in die exception-Meldung hier:
Token signiert wird mit dem Standard-Schlüssel-id-Klausel für ein X. 509-Zertifikat: der Fingerabdruck. Die Metadaten ist die Offenlegung nur die RSA-Parameter und ein name-Bezeichner. Wenn der client ruft die Metadaten, es wird ein RSA-Schlüssel mit Hilfe dieser Informationen, nicht ein X. 509 Fingerabdruck.
Um diesen Fehler zu beheben, ist die Unterzeichnung von Anmeldeinformationen geändert werden, um die korrekten Namen identifier:
Diese beinhaltet die erwartete Kennung in der Signatur und die Signatur erfolgreich geprüft wurde.
Das macht Sinn, aber wo hast du das cert aus?
Ich war nach einem tutorial, und ich war mit temp-Zertifikat
AddTemporarySigningCredential()
, also nach Aktualisierung der web-app, es funktioniert.InformationsquelleAutor