Мне было поручено проверить токен JWT, который был закодирован с использованием алгоритма PS256, и в течение последних двух дней у меня были проблемы с ним.Мне не хватает знаний по этому вопросу, и я медленно разбираюсь с проблемой, пытаясь найти разные решения.
// Encoded
eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtpZDEyMzQifQ.eyJpc3MiOiJmb28uYmFyLnRlc3Rpc3N1ZXIiLCJleHAiOjE1NTEyMDEwNjgsImF0X2hhc2giOiJqaFl3c1pyTnZ0dFNYQnR6QVMtWlNnIn0.yJePyxdJWyydG4HM97oQag6ulGKa5Afw-LHYYEXz7lVy8v0IJD0mSO9WtowlWJIeD2Vvthuj71XUfHsgz0LD9rK0VBucJbd_OiIXpbwPUqBcdj82DNLFXDJfCJnUC-Rv8QP7OUVBvLjvBQ6WYMrx1Qnq8xP6qeL_ohKwRmo6EDhZRkYBz9gFhfha1ZlKcnyR73nXdShwy7OmmyiRvVWPBf_GgSsfz8FNNoKySW1MA4tRa7cl3zPlyCnWyLaZ3kcQsmTqarHG--YXSDF5ozZ_Sx6TkunCxrOYzOFNcPyeIWqI84cemM6TgMBw9jhzMCk7Y4Fzxe5KEYJH4GlGA4s4zg
// Header
{
"alg": "PS256",
"typ": "JWT",
"kid": "kid1234"
}
// Payload
{
"iss": "foo.bar.testissuer",
"exp": 1551201068,
"at_hash": "jhYwsZrNvttSXBtzAS-ZSg"
}
У меня есть рабочая реализация для JWT с кодировкой RS256, использующая JWTSecurityTokenHandler предоставляется в Microsoft.IdentityModel.Tokens и System.IdentityModel.Tokens.Jwt .Для реализации RS256 у меня есть IssuerSigningKeyResolver , который выполняет пользовательские проверки для ребенка и предоставляет открытый ключ
var tokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = issuer,
ValidateLifetime = true,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateAudience = false,
ValidateIssuer = true,
IssuerSigningKeyResolver = (string token, SecurityToken securityToken, string kid, TokenValidationParameters validationParameters) =>
{
// Custom kid checks
var rsa = RSA.Create();
rsa.ImportParameters(new RSAParameters
{
Exponent = Base64UrlEncoder.DecodeBytes(matchingKid.E),
Modulus = Base64UrlEncoder.DecodeBytes(matchingKid.N),
});
latestSecurityKeys.Add(matchingKid.Kid, new RsaSecurityKey(rsa));
var securityKeys = new SecurityKey[1]
{
new RsaSecurityKey(rsa)
};
return securityKeys;
}
};
var tokenHandler = new JwtSecurityTokenHandler();
try
{
var principal = tokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken validatedToken);
return true;
}
catch (SecurityTokenException ex)
{
// Do something with ex
return false;
}
. Эта реализация не работает для JWT в кодировке PS256.Я отладил JwtSecurityTokenHandler внутри System.IdentityModel.Tokens.Jwt , но кажется, что, хотя PS256 находится в списке поддерживаемых алгоритмов, проверка не проходит.
Я должен еще раз заявить, что мои знания по этому предмету ограничены.Из чего я понимаю RSA256 и PS256 находятся в одном семействе алгоритмов?Не лучше ли создать пользовательскую проверку JWT для PS256 с использованием другой библиотеки, например jose-jwt ?