SecurityTokenSignatureKeyNotFoundexception lors de la validation de JWT signature
Je suis en train de mettre en œuvre les OpenID Connect spécification pour mon organisation. Je suis à l'aide de Microsoft OWIN la mise en œuvre d'OpenID Connect dans un test de la partie de confiance de l'application pour vérifier ma mise en œuvre du protocole.
J'ai exposé les métadonnées suivantes du document:
{
"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"
]
}
La clé de signature est exposé dans le présent document:
{
"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"
}
]
}
L'identité jeton est généré à l'aide de la JwtSecurityToken
classe et de son gestionnaire, à l'aide de la X509SigningCredentials
classe. Ce code est représentative de la façon dont le jeton est construit et est retourné à l'appel système comme un paramètre de la réponse de données.
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.
Lorsque je tente de passer le jeton signé à l'arrière de la partie utilisatrice de l'application, le OWIN middleware accepte le POSTE, et tente de vérifier la signature de la marque. En agissant de la sorte, l'exception suivante est générée:
SecurityTokenSignatureKeyNotFoundexception: IDX10500: Signature
la validation a échoué. Incapable de résoudre SecurityKeyIdentifier:
'SecurityKeyIdentifier ( IsReadOnly = False, Compteur = 1, Clause[0] =
X509ThumbprintKeyIdentifierClause(Hash =
0xF8A59280B3D13777CC7541B3218480984f421450) ) ', jeton:
'{"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'.
Le composant est toujours en pré-version, et c'est peut-être une faille dans la mise en œuvre, mais je tiens pour acquis que c'est mon erreur jusqu'à ce que toutes les possibilités ont été éliminées.
Est-ce que je suis en train de faire ce qui est évidemment faux, ou est-il quelque chose que je doit faire pour comprendre exactement pourquoi la signature est de ne pas être validées?
OriginalL'auteur Paul Turner | 2014-07-09
Vous devez vous connecter pour publier un commentaire.
Le problème est niché dans le message d'exception ici:
Le jeton est signé avec la clé par défaut identifiant clause de X. 509 certificate: de son empreinte. Les métadonnées sont à exposer le RSA paramètres et un identificateur de nom. Lorsque le client récupère les métadonnées, il met en place une clé RSA à l'aide de cette information, pas un X. 509 de l'empreinte numérique.
Pour corriger cette erreur, la signature d'informations d'identification doivent être modifiées afin d'y inclure le nom de l'identificateur:
Cela inclut le escomptés identificateur dans la signature, et la signature est validée avec succès.
Cela fait sens, mais où avez-vous obtenu le cert?
J'ai été à la suite d'un tutoriel, et j'ai été en utilisant temp certificat
AddTemporarySigningCredential()
, donc après l'actualisation de l'application web, il fonctionne.OriginalL'auteur Paul Turner