Ошибка запроса на публикацию API Graph (Создание элемента списка) «Доступ запрещен» для пользователей гостевой рекламы

#azure-active-directory #microsoft-graph-api #sharepoint-online

Вопрос:

У меня довольно странная проблема (ну, я думаю, что это так)… Я создаю веб-приложение с использованием Ionic Angular, и это приложение должно отправлять информацию на сайт SharePoint в нашей компании. Аутентификация для приложения выполняется с помощью библиотеки аутентификации Microsoft для Angular (v1), и пользователями приложения могут быть как гостевые пользователи AzureAD, так и фактические пользователи компании. Приложение успешно аутентифицирует пользователей обоих типов, и им выдается idToken вместе с accessToken. Маркер доступа затем используется для выполнения запросов API GET, ИСПРАВЛЕНИЯ и публикации графиков для определенных списков на сайте SharePoint.

Если я войду в систему как полноправный пользователь… нет никаких проблем, приложение может успешно выполнять все три типа запросов по спискам. Однако, если я вошел в приложение как гостевой пользователь, я могу успешно выполнять только запросы на ПОЛУЧЕНИЕ и ИСПРАВЛЕНИЕ, но не ПУБЛИКОВАТЬ:

Запрос на отправку почтальоном с использованием маркера доступа, полученного с помощью аутентификации MSAL

Я проверил области действия токена с помощью https://jwt.ms и убедитесь, что присутствуют следующие области:

  • Сайты.Управлять.Все
  • Сайты.Читайте.Все
  • Сайты.Переписать.Все
  • Пользователь.Прочитать профиль по электронной почте openid

Разрешения для списков предоставляются через членство в домене/группе безопасности Azure AD и то и другое; полноправный пользователь и гостевой пользователь являются участниками.

Чтобы еще больше добавить к этому, я вошел на сайт SharePoint онлайн в качестве приглашенного пользователя и могу успешно просматривать, добавлять и редактировать элементы списка из списка, но, похоже, я не могу сделать это с помощью API Graph.

Кто-нибудь видел такое поведение раньше или у кого-нибудь есть какие-либо указания?

Заранее спасибо.

Это моя настройка регистрации приложения в отношении разрешений: Разрешения API

Ответ №1:

Пожалуйста, проверьте свои разрешения на портале Azure. При получении маркера доступа от пользователя, вошедшего в систему, вам необходимо убедиться, что делегированное разрешение Sites.ReadWrite.All установлено, и предоставить согласие администратора для вашего арендатора.

введите описание изображения здесь

И в область действия должно быть добавлено это разрешение для запроса маркера доступа.

 POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token 

client_id=<client_id>
amp;scope=https://graph.microsoft.com/Sites.ReadWrite.All
amp;code=<authorization_code, see https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code>
amp;redirect_uri=<redirect_uri>
amp;grant_type=authorization_code
amp;code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong 
amp;client_secret=<client_secret>
 

Это может быть задержка примерно на 5-10 минут после добавления разрешения.

Комментарии:

1. Здравствуйте, спасибо за ваше предложение. К сожалению, это уже так, я, похоже, не могу предоставить изображение в этом комментарии, поэтому обновлю вопрос с его помощью. Регистрация приложения имеет следующие разрешения делегата, каждое из которых предоставляется для организации другим администратором Azure: Сайты. Управлять. Все, Сайты. Чтение и запись. Все, Сайты.Читайте. Все, Пользователь.Все

2. Кроме того, при запуске потока аутентификации через MSAL это URL-адрес: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize ?response_type=id_token amp;scope=user.read openid profile sites.readwrite.all sites.manage.all amp;client_id=<client_id> amp;redirect_uri=http://localhost:8100/loading amp;state=<state> amp;nonce=<nonce> amp;client_info=<client_info> amp;client-request-id=<lient-request-id> amp;response_mode=fragment

3. Как видно из URL-адреса, вы используете неявный поток . response_type=id_token означает получение id_token, но не токена доступа, попробуйте с response_type=token помощью .

4. Да, вы правы, однако библиотека MSAL, которую я использую, автоматически извлекает ссылки доступа с определенными областями для меня, я не вызываю эти URL-адреса авторизации/токенов вручную. Когда я проверяю полезную нагрузку успешного входа/авторизации. Я вижу, что извлечены как idToken, так и accessToken . И когда я проверяю доступ через jwt.ms Я вижу определенные области. Поэтому я бы ожидал, что токен будет действительным и пригодным для использования (и на самом деле он предназначен для ПОЛУЧЕНИЯ и ИСПРАВЛЕНИЯ) для ресурса Graph…