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#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?

Ответ 1

Раньше в этот старый пост по совпадению, но, поскольку у меня была аналогичная проблема почти год назад, я расскажу о своих выводах тогда. В основном способ заставить "IdSrv V2" использовать сертификат подписи - убедиться, что для доверяющей стороны не существует симметричного ключа подписи. Пока он определен, он всегда будет использовать симметричный ключ подписи. Для получения более подробной информации см. Мой сообщение в блоге.

Надеюсь, это поможет другим, которые попадают сюда: -)

Ответ 2

Я могу, наконец, закрыть это. Похоже, что сертификат подписания фактически не имеет ничего общего с jwt в протоколе oAuth2 под IdentityServer. Независимо от того, какой сертификат я использовал, я получил ошибку.

Я решил проблему с помощью Symmetric Signing Key для проверки jwt, а не сертификата подписи, найденного в разделе "Конфигурация ключа" IdentityServer.

Ответ 3

Я знаю, что это старый вопрос, но я столкнулся с одной и той же проблемой, но нашел проблему подключения в отношении состояния гонки внутри CrptoHelper.GetIdentityFromConfig, что и вызывает проблему.