Мы используем 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);