Не удается проверить AccessToken с помощью IdentityServer

Мы используем IdentityServer для аутентификации и проверяем токен доступа с помощью JwtSecurityTokenHandler ValidateToken. Раньше это работало нормально, но после того, как мы обновили наше клиентское приложение до ASP.NET Core 1.0 RTM (из RC1), проверка не удалась. Полученная ошибка:

IDX10501: Signature validation failed. Unable to match 'kid'

Когда я смотрю на KeyID используемого сертификата и дочерний элемент токена, я вижу, что они разные. Я проверил конечную точку jwks IdentityServer, чтобы убедиться, что у меня правильный сертификат, и заметил, что ID ребенка и ключа сертификата также отличаются от этой конечной точки. Как я понял, они должны быть одинаковыми?

Любые идеи, почему код сломался во время обновления, поскольку сертификат, токен и IdentityServer остались прежними, и было обновлено только ядро ​​​​клиентского приложения.

EDIT (Дополнительная информация)
Я подозреваю, что ValidateIssuerSigningKey по умолчанию имеет значение false, и ключ даже не был проверен ранее (таким образом, он работал). Теперь кажется, что ValidateIssuerSigningKey игнорируется (что является плохой практикой?), и поэтому проверка не выполняется.

Временное решение/исправление
Путем ручной настройки IssuerSigningKeyResolver и явного указания ключа для использования при проверке проблема устраняется и проверка проходит. Не уверен, насколько хорош обходной путь и почему не работает вариант по умолчанию, но, по крайней мере, сейчас я могу двигаться дальше.

упрощенный код...

new JwtSecurityTokenHandler().ValidateToken(authTokens.AccessToken,
  new TokenValidationParameters()
  {
    IssuerSigningKeys = keys,
    ValidAudience = audience,
    ValidIssuer = issuer,
    IssuerSigningKeyResolver = (arbitrarily, declaring, these, parameters) => new List<X509SecurityKey> { securityKey }
   }, out securityToken);

person Antti Simonen    schedule 07.07.2016    source источник
comment
Опишите подробнее, что у вас запущено и что вы обновили. возможно, связано с github.com/IdentityServer/IdentityServer3/issues/3040   -  person leastprivilege    schedule 07.07.2016
comment
Похоже на ту же проблему. В любом случае, я решил эту проблему, установив IssuerSigningKeyResolver вручную и явно указав ключ для использования при проверке. Я до сих пор удивляюсь, почему не работает по умолчанию, но, по крайней мере, я заработал с этим исправлением.   -  person Antti Simonen    schedule 08.07.2016
comment
Мы получили ту же ошибку, но наша проблема заключалась в том, что URL-адреса эмитента и авторитета имели разный регистр. мойсервер/sts и мойсервер/ св   -  person Larsi    schedule 07.04.2017


Ответы (1)


Клиент и API должны ссылаться на один и тот же экземпляр IdentityServer. Мы запускаем IdentityServerHost в Azure, который имеет разные слоты (основной и промежуточный) и два приложения, непоследовательно ссылающиеся на разные слоты. Клиент получил токен доступа, выданный IdSrv-основным провайдером, и передал его API, который ожидал его от другого провайдера IdSrv-staging. API проверил его и вернул ошибку.

Проблема в том, что ошибка не дает намека на фактическую причину проблемы. MS должна предоставить гораздо более подробное сообщение об ошибке, чтобы помочь в отладке. Текущего сообщения об ошибке недостаточно для определения причины.

person Michael Freidgeim    schedule 18.09.2017