JwtSecurityTokenHandler().ValidateToken():: Проверка подписи завершилась неудачно... sha256 не поддерживается в этом контексте
Я получаю следующую ошибку при выполнении функции 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 '
Странная часть в том, что прямо за этой частью сообщения об ошибке находятся утверждения, которые были закодированы в токене. В качестве обходного пути я делаю некоторый анализ текста и воссоздаю свой ClaimsPrincipal, но мне не нужно было этого делать.
Любые идеи, как включить sha256 для этого контекста?
ОБНОВЛЕНИЕ: Поскольку у меня не было никаких движений по этому вопросу (за исключением получения значка с камышом), я добавлю еще некоторые детали. Может быть, кто-то может помочь мне разобраться, откуда возникла проблема. Я должен предположить, что, поскольку никто другой не сталкивается с этой проблемой, это должно быть ошибка пользователя где-то с моей стороны. Пожалуйста скажите мне, если что-то звучит неправильно.
Я предполагаю, что, поскольку мы терпим неудачу при проверке jwt, возможно, это как-то связано с сертификатом на машине проверки / idP.
- Я создал сертификат подписи sha256 для idP и поместил его в личные сертификаты на idP.
- Я экспортировал открытый ключ этого сертификата и поместил в папку Cert доверенных людей на моей машине проверки.
- Затем я получаю следующий код на моей машине проверки после получения токена от моего 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);
Обратите внимание на мое использование следующих заполнителей, показывающих, откуда данные заполняются:
- ThinkTect идентификационный сервер 2. Конфигурация => Конфигурация ключа => Подписание отпечатка
- идентификационный сервер thinktecture 2. Конфигурация => Проверяющая сторона => Имя области / области
- сервер идентичности thinktecture 2.Configuration => Общая конфигурация => Идентификатор сайта
Есть ли что-нибудь, что вы можете видеть, что я делаю неправильно в этом случае?
ОБНОВЛЕНИЕ 2
Я столкнулся с этим кодом: http://pastebin.com/DvQz8vdb и после запуска моего JWT через него я выдал ту же ошибку: в основном он говорит, что поддерживает только "RS256", "HS384" или "HS512". Возможно, это моя проблема... мой JWT возвращается HS256, а не RS256 или HS >256 (384/512)
Как я могу изменить алгоритм подписи с HS256, чтобы сказать HS512?
И в этот момент я думаю, что мы вернулись к проблеме Identity Server?
3 ответа
Случайно натолкнулся на этот старый пост, но, поскольку у меня была похожая проблема почти год назад, я упомяну о своих выводах того времени. По сути, способ "заставить" IdSrv V2 использовать сертификат подписи - убедиться, что для Проверяющей стороны не определен симметричный ключ подписи. Пока он определен, он всегда будет использовать симметричный ключ подписи. Смотрите мой блог на нем для более подробной информации.
Надеюсь, что это может помочь другим в конечном итоге здесь:-)
Я могу наконец закрыть это. Похоже, что сертификат подписи на самом деле не имеет ничего общего с jwt в протоколе oAuth2 под IdentityServer. Независимо от того, какой сертификат я использовал, я получил ошибку.
Я решил проблему с помощью симметричного ключа подписи для проверки jwt, а не сертификата подписи, найденного в разделе "Конфигурация ключа" IdentityServer.
Я знаю, что это старый вопрос, но я столкнулся с точно такой же проблемой, но обнаружил проблему с подключением в связи с состоянием гонки внутри CrptoHelper.GetIdentityFromConfig, которая является причиной проблемы