针对 .Net Odata Web Api 使用 Excel Power Query 进行身份验证

Posted

技术标签:

【中文标题】针对 .Net Odata Web Api 使用 Excel Power Query 进行身份验证【英文标题】:authenticating with Excel Power Query against .Net Odata Web Api 【发布时间】:2015-10-19 23:25:09 【问题描述】:

我正在尝试使用 Power Query 下载我使用 .net Web Api 2 和 OData v4 nuget 包创建的 Odata Feed。

我正在尝试访问需要身份验证的 Odata 供稿。当我在电源查询中编辑身份验证类型时,我从未在请求​​中看到身份验证密钥。

如何配置 Power Query 以使用特定类型的身份验证?

奖励:我正在使用 OAuth,那么我将如何配置电源查询以发送包含“Authorization Bearer:token_here”的身份验证数据的标头

【问题讨论】:

这似乎是相关的。也许我需要配置我的 web api 以在授权失败时响应“WWW-Authenticate”标头? 【参考方案1】:

Web API 凭证用于将秘密值放入 URL 查询(即您的某些网站的 API 密钥)。

目前无法通过凭据对话框在 Power Query 中添加您自己的 Bearer 令牌。

它的安全性较低且无法刷新,但您可以使用OData.Feed 的 Header 参数直接对您的凭据进行硬编码:

= OData.Feed("http://localhost/", null, [Headers = [Authorization = "Bearer token_here" ] ])

(或者,将服务器配置为接受 Power Query 支持的基本身份验证可能更容易。)

【讨论】:

当我发送一个填写了 API 密钥的测试请求时,我没有在标题或 url 参数中看到密钥。我需要在 .net 端配置什么来让 excel 发送 api 密钥吗? 这里是 ApiKeyName 的一个示例:= OData.Feed("http://example.com/Path?Version=22", null, [ApiKeyName = "MyCustomKeyName"]) 然后将凭据设置为具有值“SuperSecretKey”的 Web API Power Query 请求 http://example.com/Path?Version=22&MyCustomKeyName=SuperSecretKey 非常感谢。如果我遇到任何其他问题,您是否可以向我指出任何包含此类信息的文档? 一些关于 odata.feed 的文档:msdn.microsoft.com/en-us/library/mt260868.aspx 这是不正确的方法,因为令牌中包含 IP 地址,并且可能会被您的后端服务怀疑。【参考方案2】:

这是应该如何完成的,并且已经过测试和工作。 令牌总是重新生成。

let
GetJson = Json.Document(Web.Contents("https://myservice.azurewebsites.net/oauth/token",
     [
         Headers = [#"Accept"="application/json",
                    #"Content-Type"="application/x-www-form-urlencoded;charset=UTF-8"],
         Content = Text.ToBinary("login=MYUSERNAME&password=MYPASSWORD&grant_type=password")
     ])),
    access_token = GetJson[access_token],
    AccessTokenHeader = "Bearer " & access_token,
JsonTable =  Json.Document(Web.Contents(

  "https://myservice.azurewebsites.net/odata/Cities",
  [
   Query=[ #"filter"="", #"orderBy"=""],
   Headers=[#"Authorization" = AccessTokenHeader ]
  ])),
#"Cities" = Table.FromRecords(JsonTable[value])
in
    #"Cities"

// 注意,设置隐私凭证时,设置为“Organizational”,不是private,当然也不是public。

【讨论】:

对于 MYUSERNAME / MYPASSWORD - 这些凭据是您在 Azure AD 中创建的服务帐户的凭据吗?

以上是关于针对 .Net Odata Web Api 使用 Excel Power Query 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 OData 的 ASP.Net Core Web API 实现对于单个实体 URI 失败

如何在 ASP.NET Web API 实现中将数组传递给 OData 函数?

Asp.Net Web API 2第十八课——Working with Entity Relations in OData

Asp.net Odata Web API 跨域放置和路径请求浏览器预检错误

无法使用 ASP.NET (MVC 4) Web API OData Prerelease 加载文件或程序集 System.Net.Http,版本 = 4.0.0.0

ASP.NET Odata Web API 的错误处理