Когда действительно JWTSecurityTokenHandler.ValidateToken() действительно?

Я пытаюсь создать метод проверки токена, который возвращает значение true, если токен JWT действителен на основе подписи. Я не думаю, что мне действительно нужно проверять все в токене, но что на самом деле означает, что токен действителен после вызова 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;
}

1 ответ

Решение

Я проверяю все значения претензий вручную. Я искал окончательный ответ на тот же вопрос, но единственное, что я видел, это то, что функция ValidateToken выдает исключение, если что-то не так, поэтому я начинаю с того, что заверну вызов в try-catch и верну false из подвох

Это всего лишь мой "первый проход" при проверке токена. После этого я делаю немного тяжелее, чтобы проверить определенные значения вручную. Например, я удостоверяюсь, что значение 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 был нулевым.

Другие вопросы по тегам