web-dev-qa-db-ja.com

JWTSecurityTokenHandler.ValidateToken()が実際に有効になるのはいつですか?

署名に基づいてJWTトークンが有効な場合にtrueを返すトークン検証メソッドを作成しようとしています。本当にトークンのすべてを検証する必要があるとは思いませんが、ValidateToken()を呼び出した後にトークンが有効であることを実際に示すものは何ですか?原則の存在?参照されるトークンには特定の値が含まれていますか?このメソッドからいつtrueを返すかわからない。

public bool ValidateToken(string tokenString)
{
    var validationParameters = new TokenValidationParameters()
    {
        ValidIssuer = "My Company",
        ValidAudience = ApplicationId,
        IssuerSigningKey = JsonWebTokenSecretKey
    };

    SecurityToken token = new JwtSecurityToken();
    var tokenHandler = new JwtSecurityTokenHandler();
    var principal = tokenHandler.ValidateToken(tokenString, validationParameters, out token);

    return principal != null;
}
18
Adam

すべてのクレーム値を手動で確認します。私はあなたの同じ質問に対する明確な答えを探していましたが、私が見た唯一のことは、何かが間違っているとValidateToken関数が例外をスローすることです。そのため、呼び出しをtry-catchでラップし、キャッチ。

ただし、これはトークンを検証する際の "初回パス"にすぎません。その後、特定の値を手動でチェックするために、もう少し手間をかけます。たとえば、クレームセクションのunique_name値が実際にデータベースにユーザーとして存在していること、ユーザーが非アクティブ化されていないこと、およびそのような他の独自のシステムのものがあることを確認します。

    public static bool VerifyToken(string token)
    {
        var validationParameters = new TokenValidationParameters()
        {
            IssuerSigningToken = new BinarySecretSecurityToken(_key),
            ValidAudience = _audience,
            ValidIssuer = _issuer,
            ValidateLifetime = true,
            ValidateAudience = true,
            ValidateIssuer = true,
            ValidateIssuerSigningKey = true
        };

        var tokenHandler = new JwtSecurityTokenHandler();
        SecurityToken validatedToken = null;
        try
        {
            tokenHandler.ValidateToken(token, validationParameters, out validatedToken);
        }
        catch(SecurityTokenException)
        {
            return false; 
        }
        catch(Exception e)
        { 
            log(e.ToString()); //something else happened
            throw;
        }
        //... manual validations return false if anything untoward is discovered
        return validatedToken != null;
    }

最後の行、return validatedToken != null、私の側では純粋に迷信です。 validatedTokenがnullになるのを見たことがありません。

29
Eddie Chaplin