ADFS 4.0 (2016) конфиденциальная и собственная регистрация клиента для ресурса API - PullRequest
0 голосов
/ 08 мая 2019

С учетом следующего сценария от имени, как описано в: https://docs.microsoft.com/sv-se/windows-server/identity/ad-fs/development/ad-fs-on-behalf-of-authentication-in-windows-server

ADFS OBO

Вопрос

Возможно ли этонастроить службу среднего уровня в ADFS 2016 как конфиденциальный клиент (клиент среднего уровня, действующий от имени) И общедоступный / собственный клиент, который будет использоваться из пользовательского интерфейса swagger?

Понимание примера

Чтобы служба среднего уровня могла иметь доступ к внутреннему веб-интерфейсу от имени пользователя, нам необходимо зарегистрировать конфиденциальный клиент (клиент / секрет) в ADFS с ClientID, установленным наАудитория, как указано в документации: «Очень важно, чтобы ida: Audience и ida: ClientID соответствовали друг другу»

Это означает, что в группе приложений теперь есть конфиденциальный клиент сURL-адрес (аудитория) службы среднего уровня, установленный как clientId, а не guid, который вы обычно ожидаете здесь, скажем, https://localhost:5005 ради этого примера.

Это нормально, пример теперь работает,see: https://github.com/ajtowf/WebApp-OpenIDConnect-DotNet для рабочего образца.

Проблема

Допустим, теперь я хочу добавить swagger с swagger-ui к сервису среднего уровня.Это должно быть настроено в ADFS как собственный клиент, так как мы хотим использовать неявный поток.(поток кода авторизации с PKCE не поддерживается в ADFS 2016)

НО

Если мы настроим собственный клиент с указанием для swagger, токен будет выпущен с аудиторией, которая не можетиспользоваться для доступа к самой службе среднего уровня.(судя по всему, его можно использовать для доступа к конечной точке информации о пользователе: urn: microsoft: userinfo )

Чтобы получить действительный токен доступа для службы среднего уровня, клиенту необходимобыть установленным для аудитории так же, как в случае с конфиденциальным клиентом.

НО

ClientID должен быть уникальным в пределах группы приложений, следовательно, может быть только одна регистрация с клиентом, установленным нааудитория.

Возможно ли даже настроить два отдельных потока / клиента?Я что-то упустил?

Это похоже на базовый сценарий, легко настраиваемый с помощью IdentityServer, но в этом случае я застрял с ADFS.

Конфигурация ADFS

Working sample as per documentation for On-Behalf-Of scenario. Рабочий образец в соответствии с документацией для сценария «от имени».

ClientID set to Audience for Mid Tier Service Client to be able to access Backend WebAPI On-Behalf-Of user. ClientID, установленный в Audience для клиента среднего уровня обслуживания, чтобы иметь возможностьдля доступа к Backend WebAPI On-Behalf-Of user.

Public client registration for swagger, will result in bad audience due to guid as ClientID instead of resource url. Публичная регистрация клиента для swagger приведет к плохой аудитории из-за guid в качестве ClientID вместо URL ресурса.

Can't (obviously) add another application with same ClientID. Невозможно (очевидно) добавить другое приложение с тем же ClientID.

1 Ответ

1 голос
/ 09 мая 2019

Обходной путь, передав id_token как access_token

Мне действительно не нравится этот обходной путь, но, по крайней мере, он работает, мы можем обойти эту проблему , используя конфиденциальный клиент в качестве общедоступного клиента (без секрета).

Добавлен URI перенаправления oauth2 для swagger в ADFS в качестве действительного URI для серверного приложения (я знаю !!!)

enter image description here

И затем настройка разрешений, позволяющих ему получить доступ к самому себе:

enter image description here

Это позволяет нам выдать id_token клиенту swagger.

Почему бы не выдать access_token?

Отличный вопрос! ;-) Конфиденциальному клиенту не разрешено запрашивать токен доступа, то есть response_type = токен, но response_type = id_token в порядке.

И если вы используете swagger-ui, как я, необходимо внести некоторые изменения, поскольку тип ответа жестко запрограммирован;

Но как только это будет сделано, мы можем получить id_token с действительной аудиторией, которую можно использовать для доступа к нашему API.

Он жив

ClientID как аудитория супер важно: enter image description here

Дает нам действительный id_token с правильной аудиторией для доступа к API: enter image description here

Не удовлетворен

Но imho, это взлом, использование id_token в качестве access_token просто кажется неправильным. И я действительно изо всех сил пытался изменить swagger-ui, чтобы он передавал id_token с заголовком авторизации!

Пожалуйста, предложите лучший способ сделать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...