web-dev-qa-db-fra.com

Quand JWTSecurityTokenHandler.ValidateToken () est-il réellement valide?

J'essaie de créer une méthode de validation de jeton qui renvoie vrai si un jeton JWT est valide sur la base de la signature. Je ne pense pas avoir vraiment besoin de tout valider dans le jeton, mais qu'est-ce qui signifie qu'un jeton est valide après avoir appelé ValidateToken ()? L'existence d'un principe? Le jeton référencé out contient certaines valeurs? Je ne sais pas quand renvoyer true à partir de cette méthode.

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

Je vérifie toutes les valeurs des réclamations manuellement. J'ai cherché une réponse définitive à votre même question mais la seule chose que j'ai vue est que la fonction ValidateToken lèvera une exception si quelque chose ne va pas, alors je commence par encapsuler l'appel dans un try-catch et retourner false à partir de la capture.

C'est juste mon "premier passage" pour valider le jeton, cependant. Ensuite, je fais un peu plus de levage pour vérifier manuellement certaines valeurs. Par exemple, je m'assure que la valeur unique_name dans la section des réclamations existe réellement en tant qu'utilisateur dans ma base de données, que l'utilisateur n'a pas été désactivé et d'autres éléments du système propriétaire comme celui-ci.

    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;
    }

La dernière ligne, return validatedToken != null, est purement superstition de ma part. Je n'ai jamais vu le validatedToken être nul.

29
Eddie Chaplin