5

我创建了一个带有 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 中的帐户进行身份验证。但是,当我选择“组织帐户”并尝试“登录”时,我收到以下错误:

无法连接。此资源不支持此凭据类型。

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

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

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

谢谢!

4

2 回答 2

7

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

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

  • 这是预期的标头格式:WWW-Authenticate authorization_uri=”token service uri” 引号是可选的。如果我们没有找到该标头,您会收到错误消息“无法连接。不支持此凭据类型'。

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

关于 AAD 中的应用程序对象,有两件重要的事情可以完成这项工作:

  • AppIdUris 属性必须具有与您的服务 URI 匹配的通配符 URI。当我们发送登录请求时,我们必须包含一个资源 ID,该资源是我们正在连接的服务的权限。因此,如果您的服务 url 是:myservice.com/myODatafeed.svc,权限包括方案、主机和端口号,myservice.com/ 将是权限。对于可能具有不同租户的服务,例如:company1.myservice.com,AppIdUri 必须具有 https://*.myservice.com。否则,只需https://myservice.com
  • 第二件事(这是特定于 AAD 的),AAD 目前不支持第一方客户端 (PowerQuery) 到第三方服务(您的服务)身份验证。但希望很快 :) 也许就在您完成其余工作时 :)!
于 2015-02-04T20:08:40.953 回答
0

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

于 2016-12-04T03:36:04.987 回答