Verifizieren von JWT, das mit dem RS256-Algorithmus unter Verwendung des öffentlichen Schlüssels in C # signiert wurde
Ok, ich verstehe, dass die Frage, die ich fordere, kann ziemlich offensichtlich, aber leider fehlt mir das wissen über dieses Thema und diese Aufgabe scheint zu sein, ziemlich schwierig für mich.
Ich habe ein id-token (JWT) zurückgegeben OpenID Connect-Anbieter. Hier ist es:
eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiulmyntyifq.ewogImlzcyI6ICJodHRwOi8vc2VydmVylmv4yw1wbguuy29tiiwkicjzdwiioiaimjq4mjg5nzyxmdaxiiwkicjhdwqioiaiczzcagrsa3f0myisciaibm9uy2uioiaibi0wuzzfv3pbmk1qiiwkicjlehaioiaxmzexmjgxotcwlaogimlhdci6idezmteyoda5nzasciaiy19oyxnoijogikxea3rlzg9rywszugswy25yeensdeeicn0.XW6uhdrkBgcGx6zVIrCiROpWURs-4goO1sKA4m9jhJIImiGg5muPUcNegx6ssv43c5dsn37sxcrrdzzm4zpbkkgtyasmce20sdgvyjdjs0cyufw7ijp_7wnijcrl6b5cmom6ylcvslmwkoqaxvublmwh10oaxjzd6nefsu9nipkszwhspepf_rm4empkmcbtzume-fzZIi5VjdWGGEmzTg32h3jiex-r5WTHbj-u5HL7u_KP3rmbdYNzlzd1xWRYTUs4E8notgzauwvwxkiqhoh5tpcsmbyy6x3e7-_gr9Ue6n4ND7hTFhtjYs3cjNKIA08qm5cpvyfmfmg6pkhzlq
Header und payload dekodiert, wie diese:
{
"kid":"1e9gdk7",
"alg":"RS256"
}.
{
"iss": "http://server.example.com",
"sub": "248289761001",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"c_hash": "LDktKdoQak3Pk0cnXxCltA"
}
Aus der IODC-provider Entdeckung, ich habe den öffentlichen Schlüssel (JWK):
{
"kty":"RSA",
"kid":"1e9gdk7",
"n":"w7Zdfmece8iaB0kiTY8pCtiBtzbptJmP28nSWwtdjRu0f2GFpajvWE4VhfJAjEsOcwYzay7XGN0b-X84BfC8hmCTOj2b2eHT7NsZegFPKRUQzJ9wW8ipn_aDJWMGDuB1XyqT1E7DYqjUCEOD1b4FLpy_xPn6oV_TYOfQ9fZdbE5HGxJUzekuGcOKqOQ8M7wfYHhHHLxGpQVgL0apWuP2gDDOdTtpuld4D2LK1MZK99s9gaSjRHE8JDb1Z4IGhEcEyzkxswVdPndUWzfvWBBWXWxtSUvQGBRkuy1BHOa4sP6FKjWEeeF7gm7UMs2Nm2QUgNZw6xvEDGaLk4KASdIxRQ",
"e":"AQAB"
}
So, die Frage ist, wie genau das in C# kann ich dies überprüfen, JWT, wobei der öffentliche Schlüssel für die RS256 Algorithmus, den ich habe? Es wäre genial, wenn es ein gutes tutorial beschreibt dieses Verfahren ausdrücklich. Aber, ein Beispiel, wie dies zu tun mit System.IdentityModel.Tokens.Jwt
wird auch funktionieren.
UPDATE:
Ich verstehe, dass ich brauche, um etwas zu tun, wie der code unten, aber ich habe keine Ahnung, wo man 'Schlüssel' für die Berechnung von SHA256-hash.
string tokenStr = "eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ.ewogImlzcyI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZfV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5NzAsCiAiY19oYXNoIjogIkxEa3RLZG9RYWszUGswY25YeENsdEEiCn0.XW6uhdrkBgcGx6zVIrCiROpWURs-4goO1sKA4m9jhJIImiGg5muPUcNegx6sSv43c5DSn37sxCRrDZZm4ZPBKKgtYASMcE20SDgvYJdJS0cyuFw7Ijp_7WnIjcrl6B5cmoM6ylCvsLMwkoQAxVublMwH10oAxjzD6NEFsu9nipkszWhsPePf_rM4eMpkmCbTzume-fzZIi5VjdWGGEmzTg32h3jiex-r5WTHbj-u5HL7u_KP3rmbdYNzlzd1xWRYTUs4E8nOTgzAUwvwXkIQhOh5TPcSMBYy6X3E7-_gr9Ue6n4ND7hTFhtjYs3cjNKIA08qm5cpVYFMFMG6PkhzLQ";
string[] tokenParts = tokenStr.Split('.');
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(
new RSAParameters() {
Modulus = FromBase64Url("w7Zdfmece8iaB0kiTY8pCtiBtzbptJmP28nSWwtdjRu0f2GFpajvWE4VhfJAjEsOcwYzay7XGN0b-X84BfC8hmCTOj2b2eHT7NsZegFPKRUQzJ9wW8ipn_aDJWMGDuB1XyqT1E7DYqjUCEOD1b4FLpy_xPn6oV_TYOfQ9fZdbE5HGxJUzekuGcOKqOQ8M7wfYHhHHLxGpQVgL0apWuP2gDDOdTtpuld4D2LK1MZK99s9gaSjRHE8JDb1Z4IGhEcEyzkxswVdPndUWzfvWBBWXWxtSUvQGBRkuy1BHOa4sP6FKjWEeeF7gm7UMs2Nm2QUgNZw6xvEDGaLk4KASdIxRQ"),
Exponent = FromBase64Url("AQAB")
});
HMACSHA256 sha = new HMACSHA256(key);
byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(tokenParts[0] + '.' + tokenParts[1]));
byte[] signature = rsa.Encrypt(hash, false);
string strSignature = Base64UrlEncode(signature);
if (String.Compare(strSignature, tokenParts[2], false) == 0)
return true;
InformationsquelleAutor der Frage Dmitry Nikolaev | 2015-12-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank jwilleke, ich habe eine Lösung. Um zu überprüfen, die RS256 Signatur von JWT, ist es nötig, um die
RSAPKCS1SignatureDeformatter
Klasse und Ihre VerifySignature Methode.Hier ist der genaue code für mein Beispiel-Daten:
InformationsquelleAutor der Antwort Dmitry Nikolaev
Hier ist ein Beispiel mit IdentityModel.Token.Jwt für die Validierung:
InformationsquelleAutor der Antwort olaf