Я получаю следующее сообщение об ошибке, когда я выполняю функцию JwtSecurityTokenHandler() ValidateToken():.JwtSecurityTokenHandler() ValidateToken проверки() :: Подпись не удалось ... sha256 не поддерживается в этом контексте
Вот мой псевдо-код:
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: Crypto алгоритм 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256 '
Странная часть заключается в том, что прямо за этой частью сообщения об ошибке содержатся претензии, которые были закодированы в токен. В процессе работы я выполняю некоторые синтаксические разбора текста и реконструирует свой ClaimsPrincipal, но мне не нужно это делать.
Любые идеи, как включить sha256 для этого контекста?
ОБНОВЛЕНИЕ: Поскольку у меня не было никакого движения по этой проблеме (кроме получения значка перекатистой стороны), я добавлю несколько подробностей. Возможно, кто-то может помочь мне в работе, где возникает проблема. Я должен предположить, что, поскольку никто другой не сталкивается с этой проблемой, должна быть ошибка пользователя с моей стороны где-то. Скажите, пожалуйста, если что-то звучит некорректно.
Я предполагаю, что, поскольку мы не выполняем проверку jwt, возможно, это имеет какое-то отношение к сертификату на машине проверки/idP.
- Я создал сертификат подписи sha256 для idP и поместил его в персональные сертификаты на idP.
- Я экспортировал открытый ключ этого сертификата и поместил в папку Cert of доверенных людей моей машины проверки.
- Я затем запустить следующий код на моей проверке машине после получения маркеров от моего 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 => Key Configuration => Вход Thumbprint
- thinktecture identityserver 2.Configuration => полагающаяся сторона => Realm/Scope Name
- thinktecture identityserver 2.Configuration => Общие настройки => ID сайта
Что вы можете увидеть что я делаю не так в этом случае?
UPDATE 2
Я столкнулся с этим кодом: http://pastebin.com/DvQz8vdb и после запуска моего JWT через него я дал мне ту же ошибку: В основном это говорит, что поддерживает только «RS256», «HS384», или «HS512 ». Возможно, это моя проблема .. мой JWT возвращается HS256, а не RS256 или HS> 256 (384/512)
Как изменить алгоритм подписи с HS256 на HS512?
И в этот момент я думаю, что мы вернулись к проблеме сервера удостоверений?
Я ищу пример для проверки JWT с симметричным ключом подписи. У вас есть пример, чтобы поделиться тем, как это сделать в коде? – Brett
Ниже приведен рабочий пример для проверки JWT с помощью Симметричного ключа подписи, а не сертификата https://stackoverflow.com/a/25376518/383807 – Andy