首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有PublicClientApplicationBuilder外部用户的MSAL无法访问SharePoint

带有PublicClientApplicationBuilder外部用户的MSAL无法访问SharePoint
EN

Stack Overflow用户
提问于 2022-04-28 14:37:20
回答 1查看 312关注 0票数 0

我们有一个使用MSAL与PublicClientApplicationBuilder一起访问SharePoint的Windows应用程序,该应用程序具有登录用户的委托权限。

当我们的代码与在另一个AzureAD中作为外部用户被邀请的用户登录时一起使用,并且他的用户被添加到SharePoint站点集合的成员中时,我们将得到一个访问令牌,这将导致HTTP401。直接使用来自另一个AzureAD的用户登录是可行的。它只是与外部用户,我们无法获得访问。

当用户在浏览器中登录到SharePoint时,使用他的外部用户登录名,他可以访问其他租户SharePoint。因此,他的外部用户帐户对该站点集合具有权限,但它只在浏览器中工作,而不是从我们的MSAL客户端运行。

一些细节:

我们在AzureAD中创建了作为多租户应用程序注册的应用程序,并从SharePoint委托的权限列表中获得了所需的读写权限。

另一个AzureAD的管理员同意了所有用户的委托权限,我们在AzureAD中也这样做了。因此,无论哪个用户尝试登录和使用该应用程序,都会找到同意的权限。

我们使用这段代码获取一个公共客户端应用程序:

代码语言:javascript
复制
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注册表中。

EN

回答 1

Stack Overflow用户

发布于 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://learn.microsoft.com/en-us/azure/active-directory/develop/msal-authentication-flows#client-credentials

·同时,确保‘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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72045645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档