我在 Azure AD 中注册了一个具有站点权限的多租户应用程序。选择使用 Microsoft Graph API 读取/写入 SharePoint 站点。租户 B 已通过生成的管理员同意链接成功授予管理员同意,从而在租户 B 中生成企业应用程序。但是,虽然我可以使用应用程序注册访问租户 A 中的站点,但在以下情况下我收到“此租户的主机名无效”错误:尝试访问租户 B 中的站点。
如何解决此问题以使用 Microsoft Graph API 访问租户 B 中的站点?
任何帮助或指导将不胜感激。谢谢你。
我尝试使用租户 B 的站点调用“/sites/{hostName}:{serverRelativePath}”microsoft graph 端点,导致此错误:
{"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"}}}
在 TenantA
中创建多租户 Microsoft Entra ID 应用程序,并授予 Microsoft Graph
Sites.Selected
API 权限:
在
TenantB
中,创建了一个服务主体并授予了管理员同意:
New-AzADServicePrincipal -ApplicationId <AppIDOfTenantAApp>
获得管理员同意后,权限被授予
TenantB
企业应用程序:
当您使用客户端凭据流程时,您必须设置具有租户权限的仅限应用程序的主体:
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:TenantBClientSecret
scope↵:https://graph.microsoft.com/.default
grant_type:client_credentials
现在,我能够使用 TenantA Microsoft Entra ID 应用程序成功访问
TenantB
站点:
GET https://graph.microsoft.com/v1.0/sites/TenantBDomain.sharepoint.com:/sites/SiteName:/
如果问题仍然存在,请确保将站点 ID 而不是站点名称传递给您要传递的 API 调用。
如果您不想在加载项中授予权限以允许对应用程序的完全访问,请参阅我的此SO 线程。