如何将任何Azure Active Directory(AD)用户登录到连接到Office 365 Sharepoint Online API的共享本机应用程序

如何将任何Azure Active Directory(AD)用户登录到连接到Office 365 Sharepoint Online API的共享本机应用程序,azure,sharepoint,oauth,active-directory,office365api,Azure,Sharepoint,Oauth,Active Directory,Office365api,是否可以设置单个“本机应用程序”,供不同Azure帐户/目录上的用户使用,以便他们可以从Office 365 Sharepoint Online获取数据 我们可以使用“Web应用程序”实现此功能,因为在您设置此功能的Azure门户中,它具有“多租户”选项,可设置为“是”-此支持的说明如下: 指定是否允许外部组织中的用户 授予你的应用程序访问其组织目录中数据的权限。这 控件仅影响授予访问权限的能力。它不影响 已授予的任何访问权限 一些早期测试表明这确实有效。但是,这意味着必须使用Oauth密码,该

是否可以设置单个“本机应用程序”,供不同Azure帐户/目录上的用户使用,以便他们可以从Office 365 Sharepoint Online获取数据

我们可以使用“Web应用程序”实现此功能,因为在您设置此功能的Azure门户中,它具有“多租户”选项,可设置为“是”-此支持的说明如下:

指定是否允许外部组织中的用户 授予你的应用程序访问其组织目录中数据的权限。这 控件仅影响授予访问权限的能力。它不影响 已授予的任何访问权限

一些早期测试表明这确实有效。但是,这意味着必须使用Oauth密码,该密码必须嵌入到应用程序和此处的注释中:

状态(与应用程序机密相关):

..不应在本机应用程序中使用,因为客户端 无法可靠地存储在设备上。它是web应用程序和应用程序所必需的 web API,它能够安全地存储客户端的秘密 在服务器端

对于本机应用程序,文档如下所示:

声明:

默认情况下,本机客户端注册是多租户的。你不知道 需要采取任何操作来创建本机客户端应用程序 注册多租户

这表明它们应该按照我们希望的方式工作-但是,当我们使用OAuth流从一个不在安装本机应用程序的同一Azure广告中的帐户进行测试时,我们在验证后得到以下结果:

AADSTS70001:在目录yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

因此,这似乎不起作用。目前,唯一可行的方法似乎是创建一个Web应用程序,并将客户端ID和密码嵌入到本机应用程序中

是否有人成功使用多租户本机应用程序,或者有人对我做错了什么有任何想法/反馈,或者有人可以尝试

更新我意识到这里有两件事不对: *实际上,您可以在Azure中单击“Manifest”按钮并编辑原始JSON,更新“availableToOtherTenants”值以使其成为多租户。 *我在OAuth流中没有scope=user\u模拟

现在,我们似乎可以创建一个本地应用程序,其他组织/租户的用户可以使用它进行身份验证

更新2好的,我们的应用程序现在对一些用户有效,但至少有一个用户:

AADSTS65005:无效资源。客户端已请求访问未在客户端应用程序注册的请求权限中列出的资源。客户端应用程序ID:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。来自请求的资源值:。资源应用程序ID:zzzzzzz。来自应用程序注册的有效资源列表:00000002-0000-0000-c000-00000000000003-0000-0ff1-ce00-00000000000000。\r\n空间ID:KKKKKKKKK\r\n相关ID:CCCCCCCCCCCCC


我不明白为什么它适用于一个用户,但不适用于另一个用户,如果两者都位于创建应用程序的不同租户/Azure广告中。

如果您正在开发一个本地应用程序,该应用程序可以访问您也开发的多租户web API,您可以使用
knownClientApplications
属性将本机应用程序的
clientId
添加到web应用程序清单的清单中。因此,当其他租户的用户访问多租户web API时,它也会向其租户注册本机应用程序

请参阅下面的代码示例,该示例演示了Windows应用商店应用程序调用使用Azure AD保护的多租户web API:


我们正在尝试创建一个本机应用程序/连接器,我们可以分发该应用程序/连接器,任何人都可以使用它连接到自己的sharepoint 365数据(用户无需设置自己的OAuth应用程序)。看到我的更新上面,但也感兴趣,如果你认为这是正确的方法。抱歉的困惑。似乎您正在使用(使用
范围
而不是
资源
)。以下是对我有效的请求
https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&client_id={clientId}&redirect_uri={redirectUri}&prompt=login
。您使用的确切请求是什么?您好-我们没有使用V2.0端点。尽管我们有一个状态参数和prompt=approve,但您输入的身份验证URL与我们的非常匹配。您知道包含scope=user\u模拟是否有任何影响吗?在我的测试中,我没有注意到这有什么不同。scope=user\u模拟不应该影响这一点。OAuth 2.0和OpenID都连接到Azure AD V1.0端点中,我们需要使用
资源
参数来获取访问令牌。但是,由于您正在开发的应用程序需要Office 365 SharePoint online的权限,请确保最终用户的租户也拥有该资源的订阅。应用程序标识符是自定义应用程序的客户端id还是SharePoint online资源?应用程序id是在Azure AD中创建的本机应用程序的客户端id。我们使用资源={SharePoint_URL}但是,只有在OAuth将代码转换为令牌的最后一步中,它是否在第一个URL中,将用户引导到登录页面,似乎没有什么区别。