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

时间:2015-02-03 07:47:50

标签: asp.net-web-api odata single-sign-on azure-active-directory 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中的帐户进行身份验证。但是,当我选择“组织帐户”并尝试“登录”时,我收到以下错误:

  

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

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

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

我该如何实现这种行为?我错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:6)

以下是验证过程中PowerQuery与OData服务之间的预期流程:

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

  • 以下是预期的标头格式:WWW-Authenticate authorization_uri =“令牌服务uri”引号是可选的。如果我们找不到该标题,则会收到错误消息“无法连接”。不支持此凭据类型'

  • 例如,在您的方案中,令牌服务uri为https://login.windows.net
  • 当我们收到该回复时,我们将从标题中获取网址并发出登录请求,此时您将看到AAD的登录页面,您将能够使用您的组织凭据登录。
  • 我们将等待登录结果(应该是一个标记),在您从该服务请求数据的任何时候,该标记将用于填充标题中的承载。

有关AAD中的应用程序对象的两个重要事项是:

  • AppIdUris属性必须具有与您的服务URI匹配的通配符URI。当我们发送登录请求时,我们必须包含资源ID,资源是我们连接的服务的权限。因此,如果您的服务网址是:myservice.com/myODatafeed.svc,则权限包括方案,主机和端口号,myservice.com/将是权限。对于可能具有不同租户的服务,例如:company1.myservice.com,AppIdUri必须具有https://*.myservice.com。否则,只需https://myservice.com
  • 第二件事(特此是AAD),AAD今天不支持第一方客户端(PowerQuery)到第三方服务(您的服务)身份验证。但希望很快就足够:)也许只是当你完成其余的事情:))!

答案 1 :(得分:0)

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