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;
Kommentar zu dem Problem
Welche Rolle werden Sie erfüllen? (Client, Ressourcen-Server?) Kommentarautor: jwilleke
Es ist eine client-Anwendung. Sollte es mit einem custom OIDC Anbieter (haben keine Kontrolle über Sie) , verwendet die RS256 Unterzeichnung Algorithmus. Alles funktioniert gut, durch den moment und die überprüfung der Signatur ist das Letzte Hindernis, das ich mich vor. Kommentarautor: Dmitry Nikolaev
Absolut! Danke jwilleke! Kommentarautor: Dmitry Nikolaev
Wie kann man mit System.IdentityModel.Token.Jwt mit dem obigen Beispiel? Kommentarautor: Isura Amarasinghe

InformationsquelleAutor der Frage Dmitry Nikolaev | 2015-12-21

Schreibe einen Kommentar