Excel PowerQuery 使用 WebAPI OData 服务进行 WAAD 身份验证

WAAD Authentication with WebAPI OData service consumed by Excel PowerQuery

我创建了一个带有 OWIN 中间件的 WebAPI OData 3.0 Web 服务,该中间件配置为使用 Windows Azure Active Directory 进行身份验证。 ODataControllers 标有 [Authorize] 属性,IAppBuilder 配置如下:

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
                TokenValidationParameters = new TokenValidationParameters {
                    ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                },
            });

ida:Tenant 是我的 Windows Azure 租赁,ida:Audience 是 App ID Uri。

现在我想使用 Excel PowerQuery 使用此服务,使用 AzureAD 中的帐户进行身份验证。但是,当我选择 "Organizational account" 并尝试 "Sign in" 时,出现以下错误:

Unable to connect. This credential type is not supported for this resource.

在 Fiddler 中,我可以看到请求是使用 Bearer header 发出的,但它是空的。

我想实现类似于查询 AzureAD Graph 时的行为。
例如,如果我尝试使用 https://graph.windows.net/.onmicrosoft.com/users?api-version=2013-04-05,则会打开一个 sign-on window,并且在 Fiddler 中我可以看到传递了一个令牌。

我怎样才能实现这种行为?我错过了什么?

谢谢!

这是身份验证期间 PowerQuery 和 OData 服务之间的预期流程:

  • 当您在构建器中输入您的服务的 URI 时,单击确定,您将收到一个凭据提示,要求您提供访问该服务的凭据。
  • 通常,如果 Azure Active Directory (AAD) 是您的身份提供者,您会选择组织帐户。
  • 当您点击登录时,PowerQuery 将向您的服务发送质询请求,也就是您看到的空载体。原因是,我们不知道您的身份提供者是什么,或者我们应该在哪里让您登录,该请求需要一个 401/403 响应,其中 WWW-Authenticate header 具有身份验证端点 url.

  • 这里是预期的 header format:WWW-Authenticate authorization_uri=”token service uri”引号是可选的。如果我们没有找到 header,您会收到错误消息 'Unable to connect. This credential type is not supported'。

  • 例如,在您的场景中,令牌服务 uri 是 https://login.windows.net
  • 当我们收到该响应时,我们将从 header 获取 url 并发出登录请求,此时您将看到来自 AAD 的登录页面,您将能够使用您的组织凭据登录。
  • 我们将等待登录结果,它应该是一个令牌,该令牌将用于在您从该服务请求数据的任何时候填写 header 中的承载。

关于您在 AAD 中的应用程序 object 要完成这项工作,有两件重要的事情:

  • AppIdUris 属性 必须具有与您的服务 URI 匹配的通配符 URI。当我们发送登录请求时,我们必须包含一个资源 ID,该资源是我们正在连接的服务的权限。所以如果你的服务url是:myservice.com/myODatafeed.svc,权限包括scheme,主机和端口号,myservice.com/就是权限。对于可能具有不同租户的服务,例如:company1.myservice.com,AppIdUri 必须具有 https://*.myservice.com。否则,只是 https://myservice.com.
  • 第二件事(这是 AAD 特有的),AAD 目前不支持第一方客户端 (PowerQuery) 到第三方服务(您的服务)的身份验证。但希望很快 :) 也许就在你完成剩下的事情的时候 :)!

更新:这已在最新版本的 PowerQuery 中启用。您的应用需要公开 user_imperonation 范围,您可以开始了:)!