使用MSXML拒绝访问

Rya*_*yan 5 vb6 msxml web-services

我有一个经典ASP网站的VB6后端.然后,VB使用MSXML2.XMLHTTP在同一服务器上调用Web服务.这适用于我们所有的服务器但只有一个.如果我将Web服务站点设置为接受匿名登录,则它将起作用,但是如果我仅强制集成安全性,MSXML将返回"拒绝访问"错误.

我在这里使用示例中的代码.

Set objDom = CreateObject("MSXML2.DOMDocument")
Set objXmlHttp = CreateObject("MSXML2.XMLHTTP")

' Load XML
objDom.async = False
objDom.loadXML XmlBody

' Open the webservice
objXmlHttp.Open "POST", AsmxUrl, False

' Create headings
objXmlHttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
objXmlHttp.setRequestHeader "SOAPAction", SoapActionUrl

' Send XML command
objXmlHttp.send objDom.xml
Run Code Online (Sandbox Code Playgroud)

编辑:根据AnthonyWJones的建议,我下了清单,它仍然无法正常工作.使用Fiddler,它显示一个具有401响应的请求.身份验证选项卡显示:

No Proxy-Authenticate Header is present.
WWW-Authenticate Header is present: Negotiate
WWW-Authenticate Header is present: NTLM
Run Code Online (Sandbox Code Playgroud)

我确实注意到了一种奇怪的行为.当我使用登录到远程桌面的用户的凭据来呼叫网站时,它将起作用.我得到谈判,挑战,然后200,它会工作.当用户通过远程桌面登录而不是其他时间登录时,为什么会这样做有什么想法?

Ant*_*nes 3

我猜想当服务器使用 Windows 集成安全性进行质询时,您依赖于底层 WinINET HTTP 堆栈向服务器提供当前用户凭据。

默认情况下,如果 WinINET 认为主机服务器位于 Intranet 区域中,则它只会执行此操作。即使如此,用户 Intranet 区域安全设置也可能已调整为不允许这样做。

当以运行 VB6 应用程序的同一用户身份登录时,尝试使用客户端计算机上的浏览器访问该站点。它认为服务器位于哪个区域?如果不是 Intranet,您需要将主机添加到属于该区域的站点列表中。当您在那里时,打开区域安全设置并向下滚动到“用户身份验证”类别。登录应配置为“仅在内联网区域自动登录”。

编辑:根据您的评论,这些内容配置正确。我会做的几件事是:-

  1. 检查服务器是否严格配置为仅接受 Windows 集成安全性。
  2. 检查机器上的代理设置,权限被拒绝是否是代理服务器的问题?
  3. 使用 ProgID“MSXML2.XMLHTTP.3.0”确保使用正确版本的 MSXML dll(其他第三方应用程序的某些安装可能会损坏注册表,导致使用旧版本的 MSXML)。
  4. 在计算机上安装Fiddler ,并在 VB6 应用程序尝试调用时观看 http 对话。是否有单个 401 响应?WinINET不是使用用户凭据吗?有 3 401 条回复吗?WinINET 已尝试使用当前用户凭据,但服务器不接受它们。

至此我们进入了系统管理领域。例如,如果 fiddler 跟踪显示身份验证尝试未使用 NTLM,则其使用 Kerberos 身份验证,请检查服务器和客户端的时钟是否设置在彼此以及域控制器的 5 分钟内。

检查服务器事件日志,服务器是否无法联系域控制器。

在仅具有 Windows 集成安全性的服务器上放置一个简单的 .htm 并尝试从浏览器中访问它,是否成功?