我们已通过Azure AD(实现OAuth 2.0)在多租户SaaS应用上实现了身份验证。API可通过Angular SPA访问,也可由其他客户端访问(如注册的REST客户端,使用专用客户端ID)。如果相关:我们使用授权代码流。
在同一个应用程序上,我们有一个OData API,我们希望通过它来提供对用户应用程序(如Excel)的数据访问。由于我们是一个多租户应用程序,因此该连接需要进行身份验证,就像访问“普通”Web API一样,这样我们的数据层就可以过滤该租户拥有的数据。
即使我们只使用Microsoft服务(通过Azure)Microsoft Excel如何使用正确的身份验证方法连接到OData提要似乎并不明显。我找到了one article,它解释了如何使用带有自定义连接定义的Power Query编辑器。我不会考虑这种方法,因为它对典型的最终用户来说不是一个健壮的解决方案。除了这种自定义配置方法之外,我也读过一些关于商业第三方库接管连接的文章,但是对于我的SaaS客户来说,我不能把它作为一个通用的解决方案。
我还发现another article使用Azure函数作为代理API来获取数据。这似乎是一个针对最终用户的健壮解决方案,但我不确定如何安全地为正确的用户验证API(本文中的示例专门针对1个租户)。
**问:**是否有一个强大的(开箱即用)配置,供最终用户从Excel访问OAuth验证的OData源/API?如果没有,我应该考虑哪些安全的替代方案?
2条答案
按热度按时间blmhpbnm1#
您可以通过Excel、Word、Powerpoint和Publisher等客户端应用程序在AzureAD上进行OAuth 2.0身份验证。这适用于打开整个文件(Office 2016或更高版本)或从网页导入数据(Office 2019 / M365-应用程序)。
在REST客户端中使用OAuth身份验证时,设置OAuth身份验证的方式与常规的、文档化的OAuth流程稍有不同。
您需要返回http响应代码401(unauthorized)并添加下面的标头,而不是发送将客户端转发到https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize的标头:
在Azure AD中的应用程序注册中:
注意:所有这些都没有记录在案。我是通过嗅探Outlook和O365之间的流量发现这些标题的。
顺便说一句:如果您使用webdav协议提供文件:在Excel中从网页打开文件时,可以很好地使用javascript:
vybvopom2#
将答案编辑为最终工作版本
部分感谢其他人在这个帖子上的评论,我已经能够得到这个工作。这是我的最终解决方案(编辑从原来的答案,有一些拼图的碎片丢失)
我在Azure中注册了应用程序,公开了API,将应用程序ID URI更改为我验证的应用程序URL,并添加了user_impersonation作用域。x1c 0d1x
您需要确保您在Azure AD中拥有经过验证的自定义域名。
我接受了默认的API权限。
我创建了一个.net 6 WebApi项目,做了一个简单的odata控制器。
然后我在Program.cs中配置了API。(注意:对于客户端ID -使用您应用程序ID URI。
Program.cs
我认为这是一个很大的突破,因为我能够选择一个帐户并登录。
如果您遇到以下错误,则意味着您尚未将Azure AD中的应用ID设置为您验证的应用URL:无效资源:AADSTS 500011:在名为..... x1c4d 1x的租户中找不到资源主体......
如果你得到任何错误,或者它什么都不做,使用Fiddler运行一个跟踪。这就是我如何确定它正在寻找user_impersonation作用域。
如果您正确地完成了所有这些步骤,那么您应该在Excel中得到一个可刷新的OData数据表。
我注意到MS说它不支持连接到像这样的“任意”服务https://learn.microsoft.com/en-us/power-query/connectors/odatafeed#authenticating-to-arbitrary-services。
不过,我相信这是一个非常好的方式,为Excel超级用户提供了从Web API访问结构化数据的能力。我希望这篇文章可以为您节省我花了很多时间来完成这篇文章。