Как поток согласия определяет, какие ресурсы запрашивать? - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть мультитенантный принципал службы, который предоставляет пользовательский API. Использование MSAL. js 'UserAgentApplication Я могу запросить согласие на ресурсы, которые мне нужны при первом использовании с loginPopup. Однако я не совсем понимаю, какие ресурсы указывать в запросе. Например, допустим, я использую следующее всплывающее окно (обратите внимание на отсутствие области видимости):

await this.userAgentApplication.loginPopup({
    prompt: 'consent',
    authority: "https://login.microsoftonline.com/organizations"
})

Приложение просто запросит профиль пользователя. Достаточно справедливо.

Однако, скажем, я настраиваю всплывающее окно следующим образом:

await this.userAgentApplication.loginPopup({
  scopes: ["api://xyz/Some.Scope"]
  prompt: "consent"
  authority: "https://login.microsoftonline.com/organizations"
})

Это вызывает исключение:

Пользователь или администратор не согласился использовать приложение с идентификатором 'xxxxxxxx-xxxx-xxxx-xxxx -xxxxxxxxxx 'с именем' XYZ '. Отправьте интерактивный запрос на авторизацию для этого пользователя и ресурса.

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

И, наконец, в дополнение к Для наших собственных данных API нам нужно было иметь возможность читать группы графов в контексте приложения, поэтому я запросил их, используя конечную точку .default (разрешения указаны при регистрации участника службы). Я сделал это с помощью следующего всплывающего окна:

await this.userAgentApplication.loginPopup({
    scopes: ["https://graph.microsoft.com/.default"],
    prompt: 'consent',
    authority: "https://login.microsoftonline.com/organizations"
})

Результатом последней попытки было ... все разрешения, на которые я надеялся!

Войдите и прочитайте профиль пользователя

Чтение и запись всех групп

Моя настраиваемая область действия API (имя приложения)

Но почему в наш запрос на согласие Graph автоматически включаются запросы для других настраиваемых областей?

1 Ответ

1 голос
/ 21 апреля 2020

Это ожидаемое поведение, если вы используете согласие администратора для ресурсов.

Когда вы задаете ***/.default в качестве области действия, это эквивалентно выполнению «Предоставить согласие администратора для {вашего арендатора}» в Azure portal.

Таким образом, он запрашивает согласие администратора для всех необходимых разрешений, независимо от того, получены ли они от требуемого ресурса.

Но если вы установите https://graph.microsoft.com/user.read, он спросит Вы должны дать согласие только для разрешения user.read.

Так что в этом случае, если вы используете последнее для получения согласия администратора, api://xyz/Some.Scope также вступит в силу.

Я также пройти тестирование с моим пользовательским API api://***/.default и api://***/user.write, и оба будут работать как положено.

Вы также можете попробовать использовать следующий запрос для получения согласия администратора:

https://login.microsoftonline.com/jmaster.onmicrosoft.com/oauth2/v2.0/authorize?
client_id={client id}
&response_type=code
&redirect_uri={redirect url}
&response_mode=query
&scope=api://xyz/Some.Scope
&state=12345
&prompt=consent

Пожалуйста, повторите попытку с api://***/.default. Не беспокойтесь, если это не сработает, потому что api://xyz/Some.Scope также вступит в силу с использованием последнего фрагмента кода.

...