将 Excel 连接到 Azure 上的 OAuth API

Sup*_*pez 5 excel azure oauth-2.0 azure-active-directory

我们已通过 Azure AD(实现 OAuth 2.0)对多租户 SaaS 应用程序实施身份验证。API 可通过 Angular SPA 访问,也可由其他客户端(例如具有专用客户端 ID 的注册 REST 客户端)访问。如果相关的话:我们使用授权代码流程。

在同一个应用程序上,我们有一个 OData API,我们希望通过它提供对用户应用程序(例如 Excel)的数据访问。由于我们是一个多租户应用程序,因此需要像访问“普通”Web API 时一样对连接进行身份验证,以便我们的数据层可以过滤该租户拥有的数据。

尽管我们只使用 Microsoft 服务(通过 Azure),但 Microsoft Excel 如何使用正确的身份验证方法连接到 OData 源似乎并不明显。我发现一篇文章解释了如何使用具有自定义连接定义的 Power Query 编辑器。我不会考虑这种方法,因为它对于典型的最终用户来说不是一个强大的解决方案。除了这种自定义配置方法之外,我还阅读了有关接管连接的商业第三方库的信息。然而,对于我的 SaaS 客户,我不能建议将此作为通用解决方案。
我还发现另一篇文章使用 Azure 函数作为代理 API 来获取数据。对于最终用户来说,这似乎是一个强大的解决方案,但我不确定如何安全、正确地为正确的用户验证 API(本文中的示例专用于 1 个租户)。

问:是否有强大的(开箱即用的)配置供最终用户从 Excel 访问经过 OAuth 身份验证的 OData feed/API?如果没有,我应该考虑哪些安全的替代方案?

ARN*_*ARN 5

您可以从客户端应用程序(例如 Excel、Word、Powerpoint 和 Publisher)在 AzureAD 上进行 OAuth 2.0 身份验证。这适用于打开整个文件(Office 2016 或更高版本)或从网页(Office 2019 / M365 应用程序)导入数据。

当您在 REST 客户端中使用 OAuth 身份验证时,设置 OAuth 身份验证的方式与常规且记录良好的 OAuth 流程略有不同。

您不需要发送将客户端转发到https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize的标头 ,而是需要返回 http 响应代码 401(未经授权)并添加以下标头:

WWW-Authenticate: Bearer resource="https://management.azure.com/" client_id="{the client id of your registered app in Azure AD}", trusted_issuers="00000001-0000-0000-c000-000000000000@*", token_types="app_asserted_user_v1 service_asserted_app_v1", authorization_uri="https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize",Basic Realm=""'
Run Code Online (Sandbox Code Playgroud)

在 Azure AD 中您的应用程序注册中:

  • 在API权限中:
    • Azure Active Directory 图形 > 用户.读入
  • 公开一个API:
    • 添加范围:https://{fqdn of your api}/email(电子邮件或用于身份验证的其他属性)
    • 授权客户端应用程序 > 添加客户端应用程序:d3590ed6-52b3-4102-aeff-aad2292ab01c(MS Office的ID)

注意:所有这些都没有记录在案。我通过嗅探 Outlook 和 O365 之间的流量发现了标头。

顺便说一句:如果您使用 webdav 协议提供文件:从网页中打开 Excel 文件可以很好地使用 javascript:

location.href = "ms-excel:ofe|https://{yourAPI}/your_output.xlsx"
Run Code Online (Sandbox Code Playgroud)