web-dev-qa-db-ja.com

C#でJWTトークンを手動で検証する

問題が発生しています手動で検証 Identity Server 4によって発行されたJWTトークン

ClientId: "CLIENT1" ClientSecret: "123456"

取得し続ける例外は次のとおりです。IDX10501:署名の検証に失敗しました。キーを一致させることができません: '[PIIはデフォルトで非表示です。 IdentityModelEventSource.csの 'ShowPII'フラグをtrueに設定して表示します。] '

誰が私が間違っているのか教えてくれますか?.

    private static void ValidateJwt(string jwt, DiscoveryResponse disco)
    {        

        var parameters = new TokenValidationParameters
        {

            ValidateIssuerSigningKey = true,
            ValidIssuer = disco.Issuer,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("123456")),               
            ValidAudience = "CLIENT1",
            //IssuerSigningKeys = keys,
            // ValidateAudience = true,
            // ValidateLifetime = true,
        };

        SecurityToken validatedToken;
        var handler = new JwtSecurityTokenHandler();
        handler.InboundClaimTypeMap.Clear();

        try
        {
            var user = handler.ValidateToken(jwt, parameters, out validatedToken);
        }
        catch(Exception ex)
        {
            var error = ex.Message;
        }

    }
7
MarzSocks

このサンプルのValidateJwt()を確認してください。

https://github.com/IdentityServer/IdentityServer4/blob/master/samples/Clients/src/MvcManual/Controllers/HomeController.cs

不足しているのは、ディスカバリドキュメントから公開キーをロードすることです。

6
mackie

秘密鍵の長さを変更してみてください。秘密鍵が小さすぎてエンコードできないと思います。

6
Arjit Sharma

IdentityServerはRS256を使用してJWTに署名します。これは、公開鍵を使用してJWTを検証する必要があることを意味します(これはディスカバリー文書から取得できます)。

クライアントIDとクライアントシークレットは、トークンの要求に使用されるクライアント資格情報です。それらはそれらを検証する部分を持ちません。

1
Scott Brady

JWT検証にSymmetricKeyを使用しようとしています。 JWT.io でトークンを探してみてください。アルゴリズムが「RS256」の場合、SymmetricKeyは機能しません。

1
akhileshcoer

以下を指定しました:

IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secret"))

しかし、JwtSecurityTokenHandlerは、キーと一致しませんでした jwtヘッダー自体の一部である可能性があります 。基本的に、実際の発行者の構成と構成が一致しない[es]ことを意味します。エラーは、これが署名キーに関連していることを示唆しています。

その発行者の構成を確認し(可能な場合)、欠落している部品を見つけて、再試行してください。

jwt.io を使用して、jwtをオンラインでデバッグできます。

0
stukselbax