Azure Поток учетных данных клиента OAuth2 - ошибка при получении токена для нескольких областей - PullRequest
0 голосов
/ 11 января 2020

При использовании библиотеки MSAL для генерации токена доступа для фонового консольного приложения, используя client_credentials, для вызова двух конечных точек REST, вызов get token создается как:

client_id=XXX&client_info=1&client_secret=XXXX&scope=api%3A%2F%2FMyService-DevBlr-ClientServices%2F.default+api%3A%2F%2FMyService-DevBlr-CoreServices%2F.default&grant_type=client_credentials

и отправляется на

https://login.microsoftonline.com/a1326aec-378e-4433-8e2a-67a086554fc8/oauth2/v2.0/token

Ответом является ошибка 400:

{"error":"invalid_scope","error_description":"AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid. The scope api://MyService-DevBlr-ClientServices/.default api://MyService-DevBlr-CoreServices/.default is not valid.\r\nTrace ID: 203ad632-5e7c-4e61-9dcd-185eb9b49200\r\nCorrelation ID: 99fd979a-2c11-485b-ba14-c0cad3312e02\r\nTimestamp: 2020-01-11 08:36:29Z","error_codes":[70011],"timestamp":"2020-01-11 08:36:29Z","trace_id":"203ad632-5e7c-4e61-9dcd-185eb9b49200","correlation_id":"99fd979a-2c11-485b-ba14-c0cad3312e02"}

Когда передаются отдельные области, вызов работает нормально:

Request:
client_id=XXXX&client_info=1&client_secret=XXXX&scope=api%3A%2F%2FMyService-DevBlr-CoreServices%2F.default&grant_type=client_credentials 

Response:
{"token_type":"Bearer","expires_in":3599,"ext_expires_in":3599,"access_token":"eyJ0e..."}

и

Request: 
client_id=XXXX&client_info=1&client_secret=XXXX&scope=api%3A%2F%2FMyService-DevBlr-ClientServices%2F.default&grant_type=client_credentials

Response:
{"token_type":"Bearer","expires_in":3599,"ext_expires_in":3599,"access_token":"eyJ0eX..."}

Документация и API поддерживают массив областей: https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Client-credential-flows#code -snippet

Есть преимущество в получении одного токена для использования с несколькими вызовами службы, но я не могу похоже, это работает. Любое предложение приветствуется.

1 Ответ

2 голосов
/ 11 января 2020

Когда вы получаете токен доступа, вы можете указать только области действия для одного API. Мне кажется, вы пытаетесь получить токен с разрешениями для 2 API. Это невозможно.

Маркер доступа всегда содержит только разрешения для одного API. Поэтому вы должны запрашивать их отдельно.

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

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