Когда действительно 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 был нулевым.