Я получаю следующую ошибку при выполнении функции JwtSecurityTokenHandler(). Функция ValidateToken():
Вот мой псевдокод:
var jwtToken = {...}
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters {...};
var claimsPrincipal = tokenHandler.ValidateToken(jwtToken, validationParameters);
И вот ошибка:
Jwt10316: Signature validation failed. Keys tried: 'System.IdentityModel.Tokens.X509AsymmetricSecurityKey'.
Exceptions caught:
'System.InvalidOperationException: Jwt10518: AsymmetricSecurityKey.GetHashAlgorithmForSignature( 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256' ) threw an exception.
AsymmetricSecurityKey: 'System.IdentityModel.Tokens.X509AsymmetricSecurityKey'
SignatureAlgorithm: 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256', check to make sure the SignatureAlgorithm is supported.
Exception: 'System.NotSupportedException: Crypto algorithm 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256' not supported in this context.
at System.IdentityModel.Tokens.X509AsymmetricSecurityKey.GetHashAlgorithmForSignature(String algorithm)
at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(AsymmetricSecurityKey key, String algorithm, Boolean willCreateSignatures)'.
---> System.NotSupportedException: Crypto algorithm 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256' not supported in this context.
at System.IdentityModel.Tokens.X509AsymmetricSecurityKey.GetHashAlgorithmForSignature(String algorithm)
at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(AsymmetricSecurityKey key, String algorithm, Boolean willCreateSignatures)
--- End of inner exception stack trace ---
at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(AsymmetricSecurityKey key, String algorithm, Boolean willCreateSignatures)
at System.IdentityModel.Tokens.SignatureProviderFactory.CreateProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures)
at System.IdentityModel.Tokens.SignatureProviderFactory.CreateForVerifying(SecurityKey key, String algorithm)
at System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateSignature(SecurityKey key, String algorithm, Byte[] encodedBytes, Byte[] signature)
at System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateSignature(JwtSecurityToken jwt, Byte[] signatureBytes, IEnumerable`1 signingTokens)'.
System.NotSupportedException: алгоритм криптографии http://www.w3.org/2001/04/xmldsig-more#hmac-sha256
Странная часть заключается в том, что прямо за этой частью сообщения об ошибке являются утверждения, которые были закодированы в токен. Я работаю над разбором текста и реконструировал свой ClaimsPrincipal, но мне не нужно было это делать.
Любые идеи о том, как включить sha256 для этого контекста?
ОБНОВЛЕНИЕ: Поскольку у меня не было никакого движения по этой проблеме (за исключением получения значка перекати-поля), я добавлю несколько подробностей. Может быть, кто-то может помочь мне в работе, где проблема возникает. Я должен предположить, что, поскольку никто другой не сталкивается с этой проблемой, должна быть ошибка пользователя с моей стороны где-то. Скажите, пожалуйста, если что-то звучит некорректно.
Я предполагаю, что, поскольку мы терпим неудачу в проверке jwt, возможно, это имеет какое-то отношение к сертификату на машине проверки /idP.
- Я создал сертификат подписи sha256 для idP и поместил его в Личные сертификаты на idP.
- Я экспортировал открытый ключ этого сертификата и поместил в папку Certed доверенных лиц моей машины проверки.
- Затем я запускаю следующий код на моей машине проверки после получения токена из моего idP:
Пример:
var jwtToken = response.AccessToken;
var store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = store.Certificates.Find(X509FindType.FindByThumbprint, "thinktecture identityserver 2.Configuration => Key Configuration => Signing Thumbprint>", false)[0];
store.Close();
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters
{
AllowedAudience = "<thinktecture identityserver 2.Configuration => Relying Party => Realm/Scope Name>",
ValidIssuer = "<thinktecture identityserver 2.Configuration => General Configuration => Site ID>",
SigningToken = new X509SecurityToken(cert)
};
ClaimsPrincipal claimsPrincipal = tokenHandler.ValidateToken(jwtToken, validationParameters);
Обратите внимание, что я использую следующие заполнители, показывающие, где данные заполняются:
- thinktecture identityserver 2.Configuration = > Конфигурация клавиш = > Отслеживание отпечатков
- thinktecture identityserver 2.Configuration = > Relating Party = > Realm/Scope Name
- thinktecture identityserver 2.Configuration = > Общая конфигурация = > Идентификатор сайта
Есть ли что-нибудь, что вы видите, что я делаю неправильно в этом случае?
ОБНОВЛЕНИЕ 2
Я столкнулся с этим кодом: http://pastebin.com/DvQz8vdb и после запуска моего JWT через него я дал мне такую же ошибку: в основном, он говорит, что поддерживает только "RS256", "HS384" или "HS512". Возможно, это моя проблема.. мой JWT возвращается HS256, а не RS256 или HS > 256 (384/512)
Как изменить алгоритм подписи из HS256, чтобы сказать HS512?
И на данный момент я думаю, что мы вернулись к проблеме Identity Server?