Учетные данные клиента ADFS предоставляют поток с несколькими клиентами в группе приложений - PullRequest
0 голосов
/ 27 февраля 2020

НАСТРОЙКА:
У нас есть приложение, которое должно аутентифицироваться в API с помощью ADFS. Для этого кажется целесообразным использовать поток предоставления клиентских учетных данных;
https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/overview/ad-fs-openid-connect-oauth-flows-scenarios#client -credentials-grant-flow

Поэтому в ADFS я создал новую группу приложений с серверным приложением и веб-API со следующей настройкой,

Серверное приложение:
- Идентификатор клиента: client1
- Секрет клиента: (некоторый guid)

Веб-API:
- Проверяющие стороны: client1
- Политика контроля доступа: Разрешить всем
- Разрешения клиента -> Клиентское приложение: client1
- Разрешенные области: профиль openid allatclaim

Затем я запрашиваю токен через https://.../adfs/oauth2/token с

client_id=client1
client_secret=(some-guid) 
grant_type=client_credentials

Я получил токен JWT с aud и appid, как и ожидалось:

"aud": "microsoft:identityserver:client1"
"appid": "client1"

ПРОБЛЕМА:
Проблема возникает, когда я хочу добавить другого клиента для использования с API. Поэтому я изменяю свои настройки на

Серверное приложение 1:
- Идентификатор клиента: client1
- Секрет клиента: (some-guid)

Серверное приложение 2:
- Идентификатор клиента: client2
- Секрет клиента: (некоторый guid)

Веб-API:
- Проверяющие стороны: client1, client2
- Политика контроля доступа: Разрешить всем
- Клиентские разрешения -> Клиентское приложение: client1, client2
- Разрешенные области: профиль openid allatclaim

Затем, когда я запрашиваю токен JWT с учетными данными client2 (client_id и client_secret), я получаю:

"aud": "microsoft:identityserver:client1"

и то же самое, если я использую client1. Я попытался добавить различные проверяющие стороны в веб-API, и кажется, что он всегда устанавливает aud в JWT на первый RP в списке (в алфавитном порядке c). Например, если я также добавлю 123 в качестве RP в веб-API, то «aud» станет «microsoft: identityserver: 123» для client1 и client2.

Если я вместо этого удаляю все проверяющие стороны и добавляю URL-адрес моего API, а затем Aud в токене JWT становится "urn: microsoft: userinfo".

Из того, что я прочитал, поле aud в токене JWT должно содержать всех принципалов, которые будут обрабатывать токен JWT. См. https://tools.ietf.org/html/rfc7519#section -4.1.3 .

ВОПРОСЫ:
Как настроить группу приложений, чтобы иметь возможность иметь несколько клиентов?
Может ли ADFS отправлять несколько аудиторий вместо только первой?
Или я использовал неправильный подход?

С уважением, Джеспер

1 Ответ

0 голосов
/ 03 марта 2020

Путем проб и ошибок я наконец-то нашел, как это решить!

Проверяющие стороны в веб-API должны содержать только идентификаторы для веб-API (не серверные приложения), например, это может быть адрес типа "https://mywebapi.com».

Разрешение клиента -> Клиентские приложения должно содержать серверные приложения, которым нужно разрешить общаться с этим сервером.

Затем при запросе токена JWT из ADFS вы также Нужно включить параметр «ресурс», значение которого должно быть одним из идентификаторов веб-API. Следовательно, тело вызова становится

client_id=client1
client_secret=(some-guid) 
grant_type=client_credentials
resource=https://mywebapi.com

Я попытался найти поле ресурса, чтобы узнать о нем больше, но не смог найти объяснения или сайта, использующего его.

...