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

Or *_*r B 4 single-sign-on odata asp.net-web-api 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"]
                },
            });
Run Code Online (Sandbox Code Playgroud)

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中我可以看到令牌被传递.

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

谢谢!

小智 6

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

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

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

  • 例如,在您的方案中,令牌服务uri是https://login.windows.net
  • 当我们收到该响应时,我们将从标题中获取URL并发出登录请求,此时您将看到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)到第三方服务(您的服务)身份验证.但希望很快就足够了:)也许只是当你完成剩下的工作:)!