【问题标题】:Using an MVC API with Windows Authentication from VBA将 MVC API 与来自 VBA 的 Windows 身份验证一起使用
【发布时间】:2017-04-03 10:03:19
【问题描述】:

我开发了一个 MVC 应用程序,就这个问题而言,它只有一个控制器:

Public Function GetValue()
    Return User.Identity.Name
End Function

该应用程序将在 Intranet 网络上使用,因此,我将其设置为“Windows 身份验证”

目的是通过 VBA 查询此应用程序。

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
With objHTTP
    .Open "GET", URL, False
    .setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    .setRequestHeader "Content-type", "application/json"
    .setRequestHeader "data-type", "json"
    .send
    .WaitForResponse
    sResult = .ResponseText
End With
Debug.Print (sResult)

如果我在本地运行应用程序(即在运行 Excel 的计算机上调试),它可以通过 Chrome 运行(访问 localhost:xxxxx/api/name 会返回一个带有我的 ActiveDirectory 用户名的 xml 文件)。

VBA 例程也可以正常工作,输出窗口显示我在 Chrome 中获得的 XML。

现在,如果我将项目发布到 IIS 服务器,它仍然可以通过 Chrome 运行(访问 myserver/api/name 会返回一个带有我的 ActiveDirectory 用户名的 xml 文件)。 但是,当我运行 VBA 模块时,它返回错误 401:

Error:401 - Unauthorized: Access is denied due to invalid credentials.

它在浏览器中工作的事实让我相信服务器端配置没问题,我需要在我的 VBA 中进行一些调整。

我不得不承认我在这一点上有点无能为力...... 谢谢你给我的任何线索:)

【问题讨论】:

  • 您应该使用WinHTTPRequest.5.1 库,这将允许您调整身份验证设置以允许您登录

标签: asp.net-mvc vba windows-authentication


【解决方案1】:

感谢@SWa 的评论,我通过对函数的细微调整解决了这个问题:切换到 WinHttpRequest 并使用 setAutoLogonPolicy 0

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
With objHTTP
    .Open "GET", URL, False
    .setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    .setRequestHeader "Content-type", "application/json"
    .setRequestHeader "data-type", "json"
    .setAutoLogonPolicy 0
    .send
    .WaitForResponse
    sResult = .ResponseText
End With
Debug.Print (sResult)

【讨论】:

  • 这就像一个魅力!到目前为止,我发现的每个解决方案都使用 MSXML2.ServerXMLHTTP 和 Open 方法中的 Windows-User/Password 作为参数(这对用户不友好,因为您必须要求用户输入它或者您必须将其存储在文本中文件)。但是这个神奇的 setAutoLogonPolicy(0) 正好为我解决了这个问题。
  • 完成此操作后,我必须修改引用响应的方式。以前我做过:Set objXmlDoc = Server.CreateObject("MSXML.DOMDocument")objXmlDoc.load(objHTTP.responseXML),但是在这个改变之后我不得不使用objXmlDoc.loadXML(objHTTP.ResponseText)
猜你喜欢
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2011-04-09
  • 2018-09-28
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多