Как устранить ошибку «недопустимое имя хоста для этой аренды» при доступе к API Microsoft Graph для регистрации мультитенантного приложения?

У меня есть регистрация мультитенантного приложения в Azure AD с разрешениями для сайтов. Выбрано использование API Microsoft Graph для чтения и записи на сайты SharePoint. Тенант Б успешно предоставил согласие администратора через созданную ссылку на согласие администратора, в результате чего в Тенанте Б появилось корпоративное приложение. Однако, хотя я могу получить доступ к сайтам в Тенанте А с помощью регистрации приложения, я получаю сообщение об ошибке «недопустимое имя хоста для этого арендатора», когда пытается получить доступ к сайтам в Тенанте Б.

Как решить эту проблему для доступа к сайтам в клиенте B с помощью API Microsoft Graph?

Любая помощь или руководство будут очень признательны. Спасибо.

Я попытался вызвать конечную точку графа Microsoft "/sites/{hostName}:{serverRelativePath}", используя сайт арендатора B, что привело к этой ошибке:

{"error":{"code":"invalidRequest","message":"Invalid hostname for this tenancy","innerError":{"date":"2024-07-04T08:03:02","request-id":"22ceb0ec-b377-4086-91ec-610ed637413f","client-request-id":"22ceb0ec-b377-4086-91ec-610ed637413f"}}}

Вы пытаетесь использовать имя сайта? Или идентификатор сайта? надо попробовать с ID

Jonathan Peil 04.07.2024 22:51

Если я использую идентификатор сайта или имя сайта, я получаю сообщение 404 «Не найдено», поэтому по какой-то причине регистрация приложения не может найти сайт во внешнем арендаторе, я даже не уверен, возможно ли это, к вашему сведению.

Selmir Aljic 05.07.2024 09:27

Да, это возможно, используете ли вы поток учетных данных клиента?

Rukmini 05.07.2024 09:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте мультитенантное приложение Microsoft Entra ID в TenantA и предоставьте разрешение API Microsoft Graph Sites.Selected:

В TenantB создан Принципал службы и предоставлено согласие администратора:

New-AzADServicePrincipal -ApplicationId <AppIDOfTenantAApp>

После предоставления согласия администратора приложению TenantB Enterprise предоставляются разрешения:

Поскольку вы используете поток учетных данных клиента, вы должны настроить участника только для приложений с разрешениями клиента:

  • Sites.Selected Разрешение API разрешает доступ только к выбранным сайтам.
  • Следовательно, вам необходимо предоставить приложению доступ к сайту, к которому вы хотите получить доступ.

Перейдите к https://TenantBDomain.sharepoint.com/sites/SiteName/_layouts/15/appinv.aspx и войдите в систему под пользователем TenantB. Передайте TenantAAppID и предоставьте доступ с помощью XML-запроса:

<AppPermissionRequests AllowAppOnlyPolicy = "true">
    <AppPermissionRequest Scope = "http://sharepoint/content/sitecollection" Right = "FullControl" />
</AppPermissionRequests>

Нажмите «Создать» и «Доверьте ему»:

Создать токен доступа:

https://login.microsoftonline.com/TenantBTenantID/oauth2/v2.0/token

client_id:TenantAAppID
client_secret:TenantAClientSecret
scope↵:https://graph.microsoft.com/.default
grant_type:client_credentials

Теперь я могу успешно получить доступ к сайту TenantB с помощью приложения TenantA Microsoft Entra ID:

GET https://graph.microsoft.com/v1.0/sites/TenantBDomain.sharepoint.com:/sites/SiteName:/

Если проблема не устранена, обязательно передайте идентификатор сайта вместо имени сайта в передаваемый вызов API.

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

Я собираюсь попробовать это сейчас, это может занять некоторое время, но все еще есть часть, которая меня смущает в разделе «Создать токен доступа», который вы имели в виду client_secret: TenantBClientSecret, но на изображении ниже она выделена красным текстом с надписью TenantAClientSecret

Selmir Aljic 05.07.2024 15:08

Это была опечатка, TenantAClientSecret только обновил ответ.

Rukmini 05.07.2024 15:20

Мне не удается получить токен доступа с помощью URL-адреса клиента B, я получаю неверный запрос. Сейчас я пытаюсь продлить ведение журнала, чтобы узнать более подробную информацию.

Selmir Aljic 05.07.2024 16:37

Вы создали субъект-службу в TenantB?

Rukmini 05.07.2024 17:08

С помощью моего администратора клиента B я открыл URL-адрес согласия администратора для приложения в арендаторе A, который попросил меня дать согласие администратора приложению на использование Сайтов. После того, как я дал согласие, в арендаторе B появилось корпоративное приложение с тем же именем, что и у моего администратора клиента B. приложение в арендаторе A, это то, что вы подразумеваете под созданием субъекта-службы в арендаторе B?

Selmir Aljic 05.07.2024 17:37

Да, это то, что я имел в виду

Rukmini 05.07.2024 17:53

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

Selmir Aljic 05.07.2024 21:21

@SelmirAljic Есть какие-нибудь новости по этому вопросу?

Rukmini 08.07.2024 08:59

Только что заставил его работать локально, используя упомянутый вами подход, теперь я могу медленно понять, почему он не работает в производстве. Спасибо за помощь, это очень ценно!

Selmir Aljic 08.07.2024 10:28

Рад знать, что это помогло :)

Rukmini 08.07.2024 10:29

Другие вопросы по теме

Интеграция единого входа с использованием MSAL в проекте Angular возвращает ошибку 401 после входа в систему
ASP.NET Azure AD/Аутентификация Entra — роли приложения в токене, но не назначаются субъекту
Расширение схемы Entra ID с пользовательским пространством имен
Azure — назначение участника сети в PIM
Получение свойства пользователя Azure «Дата последней локальной синхронизации» с помощью PowerShell
Можно ли получить доступ к конфигурации приложений Azure через URL-адрес или каким-либо образом подключиться к настройке среды службы приложений?
Не удалось войти в систему для пользователя «<участник, идентифицированный токеном>» при авторизации на SQL Server через субъект-службу из назначенной группы AAD
Как найти арендатора, в котором было зарегистрировано многотенантное приложение AAD
Приложение ASP.NET Core, работающее в IIS, выдает Http-ошибку 401.2-Unauthorize
Разрешения Azure AD для MS Forms