Okta проверка токена JWT с использованием открытых ключей из конфигурации OpenID Connect - PullRequest
0 голосов
/ 01 июня 2018

Фон

Я следовал этому руководству из Okta: https://developer.okta.com/quickstart/#/ios/dotnet/aspnetcore

Реализовал версию компонента AppAuth.iOS с открытым исходным кодом из Xamarin, чтобы иметь возможность использоватьэто в проекте Xamarin.iOS.(работает)

Создан простой основной веб-сервис asp.net, как показано в статье выше, и настроен в соответствии с инструкциями.

Проблема:

Я получаю токен доступа JWT после успешной аутентификации через мобильное приложение и использую этот токен для вызова тестового веб-сервиса.Веб-службе не удается проверить токен со следующим сообщением об ошибке

Ошибка:

Signature validation failed. Unable to match keys: 'HD3v3KXvARUyg_9i26m2i8itsCY7TpA0-ajhcOsBdkM', token: '{"alg":"RS256","typ":"JWT","kid":"HD3v3KXvARUyg_9i26m2i8itsCY7TpA0-ajhcOsBdkM"}.{"ver":1,"jti":"AT.J4uuLmOgCLslqlnUzNbjhw7dzm5KurJVJxHNIXZx-g8.zQJUh4NcHWcIBvdWVLy7fXea4cCoPxv7Avh3+z6PiGM=","iss":"https://dev-111111.oktapreview.com","aud":"https://dev-111111.oktapreview.com","sub":"dsamuylov@111111.com","iat":1527861992,"exp":1527865592,"cid":"0oafa27024puCyvwi0h7","uid":"00uf9rphkt6D8gcXI0h7","scp":["offline_access","openid","profile"]}'. at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken) at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()

Отладка:

После проверки токена JWT с помощью https://jwt.io/ я обнаружил kid открытого ключа подписи, используемого для подписи токена

Затем я перешел к конфигурации openid-connect моей учетной записиhttps://dev -111111.oktapreview.com / oauth2 / default / .well-known / openid-configuration

Найдены ключи url https://dev -111111.oktapreview.com/ oauth2 / default / v1 / keys

Там указан только 1 ключ, и его kid не совпадает с ключом в заголовке токена

Вопрос:

Почему это произойдет, если я использую одну учетную запись / сервер Okta для мобильного клиента и веб-службы?Откуда исходит это ключевое несоответствие?

Действительно надеясь, что кто-то из технической команды Okta сможет взвесить и пролить свет на это, потому что, как есть, пошаговое руководство, связанное в начале вопроса, не работает.

Спасибо,

Дмитрий

1 Ответ

0 голосов
/ 04 июня 2018

Проблема оказалась проблемой конфигурации.

В мобильном клиенте, который получает токен, компонент AppAuth был инициализирован с параметром issuer, равным https://dev-111111.oktapreview.com вместо правильного значения https://dev-111111.oktapreview.com/oauth2/default

Это вызвало путаницу, поскольку вместо обнаружения конфигурации openid-connect на https://dev-111111.oktapreview.com это удалось.Причина, по которой это удалось, заключается в том, что, как мне сказал кто-то из службы поддержки Okta, он указывает на сервер авторизации для Okta API, и они хранят открытые ключи подписи, используемые для токенов API, в целях безопасности.Именно поэтому ключи подписи отличаются, потому что я по существу указывал на 2 разных сервера авторизации на клиенте и бэкэнде.

Если этот URL просто не сможет получить конфигурацию openid-connect или еслинекоторая ясная документация о разнице между двумя, я думаю, это было бы намного меньше путаницы.

Еще одна вещь, которую нужно понять, у Okta есть 2 различных продукта, основанный на IT продукт для управления аутентификацией и developerцентральный продукт.В IT центральном продукте эта функция недоступна, если вы не приобрели надстройку под названием API Access Management, если у вас есть версия developer (темно-синий заголовок на веб-сайте администратора), она доступна по умолчанию в вашей учетной записи.

Надеюсь, это поможет кому-то в будущем, спасибо команде поддержки Okta за разъяснения для меня.

...