我们有一个使用MSAL与PublicClientApplicationBuilder一起访问SharePoint的Windows应用程序,该应用程序具有登录用户的委托权限。
当我们的代码与在另一个AzureAD中作为外部用户被邀请的用户登录时一起使用,并且他的用户被添加到SharePoint站点集合的成员中时,我们将得到一个访问令牌,这将导致HTTP401。直接使用来自另一个AzureAD的用户登录是可行的。它只是与外部用户,我们无法获得访问。
当用户在浏览器中登录到SharePoint时,使用他的外部用户登录名,他可以访问其他租户SharePoint。因此,他的外部用户帐户对该站点集合具有权限,但它只在浏览器中工作,而不是从我们的MSAL客户端运行。
一些细节:
我们在AzureAD中创建了作为多租户应用程序注册的应用程序,并从SharePoint委托的权限列表中获得了所需的读写权限。
另一个AzureAD的管理员同意了所有用户的委托权限,我们在AzureAD中也这样做了。因此,无论哪个用户尝试登录和使用该应用程序,都会找到同意的权限。
我们使用这段代码获取一个公共客户端应用程序:
var clientAppId = "our-app-clientID";
var redirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient";
_clientApp = PublicClientApplicationBuilder.Create(clientAppId)
.WithRedirectUri(redirectUri)
.WithLogging(Log, LogLevel.Verbose, false)
// .WithTenantId("we tried our and the other tenants ID")
.Build();在我们试图找到解决方案时,添加了注释行.WithTenantId。
我们可以看到,它对令牌内容产生了影响。如果没有这一行,或者使用我们的tenantId,我们就会看到用户“in”是来自AzureAD中的用户的objectId。
当我们使用另一个tenantId的AzureAD时,我们在另一个AzureAD中得到外部用户对象的oid。
因此,我们希望后一次调用会成功,但也失败了,这次是HTTP 403。因此,用户令牌似乎得到了进一步的发展,但仍然没有到SharePoint站点集合。
知道这种情况是否可能发生吗?
如果可能的话,最好不要调用WithTenantId,因为否则我们需要在客户端机器上查找正确的tenantId --不确定从哪里获取它,只需要询问另一个租户的管理员,并将值放入某个应用配置文件或Windows注册表中。
发布于 2022-05-04 10:52:58
·根据您的描述,最有可能的问题是,作用域可能没有正确地添加到‘sharepoint API’中,因为您使用MSAL身份验证从公共客户端访问sharepoint站点,因此需要添加并扩展从Azure AD中的公共客户端访问sharepoint站点的scopes/permissions,以满足外部用户帐户的请求。
要做到这一点,您需要通过Azure门户调用‘/_api/web/lists’,就像在MicrosoftGraph外调用SharePoint API时一样,它将检索所有列表。因此,如果您的公共客户端应用程序使用Microsoft权限执行此操作,那么当您遇到HTTP 403错误时,您将得到一个拒绝访问的错误消息。
·因此,在您的示例中,要访问sharepoint站点,您需要将作用域‘AllSites.Read’和‘Sites.ReadWrite.All’添加到您的公共客户端应用程序的Sharepoint中,因为Microsoft中的‘Sites.Read’范围还不够。此外,确保将‘https://<domain>.sharepoint.com/AllSites.Write’和‘https://<yoursite>.sharepoint.com/Sites.ReadWrite.All’作用域也添加到该公共客户端应用程序的Sharepoint中。


要通过公共客户端访问Sharepoint,您可以使用 auth,而微软推荐使用证书而不是秘密的。有关这方面的更多信息,请使用以下文档链接:-
·同时,确保‘https://microsoft.sharepoint-df.com/Sites.Search.All’和‘https://yourtenant.sharepoint.com/Sites.Search.All’也作为应用程序的作用域添加,因为Sharepoint站点可能会因为无效的受众而拒绝令牌。
有关范围修改的更多信息,请参阅以下链接以获得更多详细信息:
https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/400
https://stackoverflow.com/questions/72045645
复制相似问题