oauth-2.0 将Excel连接到Azure上的OAuth API

pcww981p  于 2022-10-31  发布在  其他
关注(0)|答案(2)|浏览(249)

我们已通过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?如果没有,我应该考虑哪些安全的替代方案?

blmhpbnm

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的标头:

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=""'

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

  • 在API权限中:
  • Azure Active Directory图形〉用户。阅读
  • 公开API:
  • 添加范围:https://{api的fqdn}/email(电子邮件或用于身份验证的其他属性)
  • 授权客户端应用程序〉添加客户端应用程序:d3590 ed 6 - 52 b3 -4102-aeff-aad 2292 ab 01 c(微软办公软件的标识)

注意:所有这些都没有记录在案。我是通过嗅探Outlook和O365之间的流量发现这些标题的。
顺便说一句:如果您使用webdav协议提供文件:在Excel中从网页打开文件时,可以很好地使用javascript:

location.href = "ms-excel:ofe|https://{yourAPI}/your_output.xlsx"
vybvopom

vybvopom2#

将答案编辑为最终工作版本
部分感谢其他人在这个帖子上的评论,我已经能够得到这个工作。这是我的最终解决方案(编辑从原来的答案,有一些拼图的碎片丢失)
我在Azure中注册了应用程序,公开了API,将应用程序ID URI更改为我验证的应用程序URL,并添加了user_impersonation作用域。x1c 0d1x
您需要确保您在Azure AD中拥有经过验证的自定义域名。

我接受了默认的API权限。

我创建了一个.net 6 WebApi项目,做了一个简单的odata控制器。

[Route("odata")]
public class WBSController : BaseODataController
{
    public WBSController(IDbContextFactory<TableDbContext> db) : base(db)
    {

    }

    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    [EnableQuery]
    [HttpGet("WBS")]
    public IQueryable<WBS> Get()
    {
        IQueryable<WBS> ret = Db.WBS;

        return ret;
    }
}

然后我在Program.cs中配置了API。(注意:对于客户端ID -使用您应用程序ID URI。
Program.cs

.AddMicrosoftIdentityWebApi(
     opt => //JwtBearerOptions
    {
        opt.Audience = "[Your App Id Uri eg. acme.com.au]";
        opt.Events = new JwtBearerEvents()
        {
            OnChallenge = async ctxv =>  
            {
                opt.Challenge =
                    @"Bearer  realm="""", client_id=""[Your App Id Uri]"", trusted_issuers=""00000001-0000-0000-c000-000000000000@*"", token_types=""app_asserted_user_v1 service_asserted_app_v1"",  authorization_uri=""https://login.microsoftonline.com/[Your Tenant Id]/oauth2/v2.0/authorize""";  //This is the magic that forces the Microsoft login dialog to open
            }
        };
    },
    opt =>   //MicrosoftIdentityOptions
    {
        opt.Instance = "https://login.microsoftonline.com/";
        opt.ClientId = "[Your App Id Uri]";
        opt.TenantId = "common";
    },
    $"{JwtBearerDefaults.AuthenticationScheme}"  //Scheme Name
);

我认为这是一个很大的突破,因为我能够选择一个帐户并登录。

如果您遇到以下错误,则意味着您尚未将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访问结构化数据的能力。我希望这篇文章可以为您节省我花了很多时间来完成这篇文章。

相关问题