JWTベアラートークンの署名を無視する(つまりトークンを検証しない)質問する

JWTベアラートークンの署名を無視する(つまりトークンを検証しない)質問する

API ゲートウェイの背後に API があります。API ゲートウェイは、リクエストを API に渡す前にベアラー トークンを検証します。

私の API は、asp.net core 2.0 ネイティブ認証およびクレーム ベースの承認フレームワークを使用します。JWT トークンからクレームを取得するという面倒な作業は、 のミドルウェアによって実行されますMicrosoft.AspNetCore.Authentication.JwtBearer

このミドルウェアは、トークンの有効期限を無視するように構成でき、ローカル公開キーを指定することもできるため、トークンを取得するためにトークン認証局に連絡する必要はありませんが、トークンの署名検証を無効にすることは可能ですか?

これにより、開発中のアドホック テストに署名されていないトークンを使用できるようになり、運用環境での二重検証 (ゲートウェイと API) を防ぐことができます。

ベストアンサー1

これを試してみてください。何度も試した後、ようやく動作するようになりました。

public TokenValidationParameters CreateTokenValidationParameters()
{
    var result = new TokenValidationParameters
    {
        ValidateIssuer = false,
        ValidIssuer = ValidIssuer,

        ValidateAudience = false,
        ValidAudience = ValidAudience,

        ValidateIssuerSigningKey = false,
        
        //IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey)),
        //comment this and add this line to fool the validation logic
        SignatureValidator = delegate(string token, TokenValidationParameters parameters)
        {
            var jwt = new JwtSecurityToken(token);

            return jwt;
        },

        RequireExpirationTime = true,
        ValidateLifetime = true,

        ClockSkew = TimeSpan.Zero,
    };

    result.RequireSignedTokens = false;

    return result;
}

編集:

dotnet 8以降では、var jwt = new JwtSecurityToken(token);SignatureValidatorを次のように置き換える必要があります。var jwt = new JsonWebToken(token);

として@トーマス前述のように、lamba も使用できます。

SignatureValidator = (token, _) => new JsonWebToken(token)

より詳しい情報:https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/8.0/securitytoken-events

おすすめ記事