У меня есть регистрация мультитенантного приложения в 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"}}}
Если я использую идентификатор сайта или имя сайта, я получаю сообщение 404 «Не найдено», поэтому по какой-то причине регистрация приложения не может найти сайт во внешнем арендаторе, я даже не уверен, возможно ли это, к вашему сведению.
Да, это возможно, используете ли вы поток учетных данных клиента?
Создайте мультитенантное приложение 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
Это была опечатка, TenantAClientSecret только обновил ответ.
Мне не удается получить токен доступа с помощью URL-адреса клиента B, я получаю неверный запрос. Сейчас я пытаюсь продлить ведение журнала, чтобы узнать более подробную информацию.
Вы создали субъект-службу в TenantB?
С помощью моего администратора клиента B я открыл URL-адрес согласия администратора для приложения в арендаторе A, который попросил меня дать согласие администратора приложению на использование Сайтов. После того, как я дал согласие, в арендаторе B появилось корпоративное приложение с тем же именем, что и у моего администратора клиента B. приложение в арендаторе A, это то, что вы подразумеваете под созданием субъекта-службы в арендаторе B?
Да, это то, что я имел в виду
В понедельник я попробую еще раз, я попробую воспроизвести это в точности так, как вы описали, и посмотрю, смогу ли я заставить это работать, я сообщу вам, каковы результаты, спасибо за помощь!
@SelmirAljic Есть какие-нибудь новости по этому вопросу?
Только что заставил его работать локально, используя упомянутый вами подход, теперь я могу медленно понять, почему он не работает в производстве. Спасибо за помощь, это очень ценно!
Рад знать, что это помогло :)
Вы пытаетесь использовать имя сайта? Или идентификатор сайта? надо попробовать с ID