我有一个经典 ASP 站点的 VB6 后端。然后,该 VB 使用 MSXML2.XMLHTTP 调用同一服务器上的 Web 服务。这适用于我们所有的服务器,但只有一个。如果我将 Web 服务站点设置为接受匿名登录,它将起作用,但是如果我强制仅集成安全性 MSXML 返回访问被拒绝错误。
我正在使用示例中的代码 here.
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
编辑:
按照 AnthonyWJones 的建议,我按照 list 进行了检查,但它仍然无法正常工作。使用 Fiddler 它显示一个带有 401 响应的请求。身份验证选项卡显示:
No Proxy-Authenticate Header is present.
WWW-Authenticate Header is present: Negotiate
WWW-Authenticate Header is present: NTLM
我确实注意到了一个奇怪的行为。当我使用登录到远程桌面的用户的凭据调用该网站时,它将起作用。我得到谈判,挑战,然后是200,它会起作用。任何想法为什么当用户通过远程桌面登录而不是其他时间时这会起作用?
最佳答案
我猜你是依靠底层的 WinINET HTTP 堆栈在使用 Windows 集成安全性受到服务器挑战时向服务器提供当前用户凭据。
只有当 WinINET 认为主机服务器位于 Intranet 区域时,它才会默认执行此操作。即使这样,用户的 Intranet 区域安全设置也可能已被调整为不允许这样做。
当您以运行 VB6 应用程序的同一用户身份登录时,请尝试使用客户端计算机上的浏览器访问该站点。它认为服务器位于哪个区域?如果它不是 Intranet,则需要将主机添加到属于该区域的站点列表中。当您在那里时,打开区域安全设置并向下滚动到用户身份验证类别。登录应配置为“仅在 Intranet 区域自动登录”。
编辑 :根据您的评论,这些东西配置正确。我会做的几件事是:-
至此,我们进入了系统管理领域。例如,如果 fiddler 跟踪显示尝试进行身份验证没有使用 NTLM,那么它使用的是 Kerberos 身份验证,请检查服务器和客户端的时钟设置是否在 5 分钟内彼此以及域 Controller 。
检查服务器事件日志,是服务器无法联系域 Controller 。
在只有 Windows 集成安全性的服务器上放置一个简单的 .htm 并尝试从浏览器中访问它,是否成功?
关于web-services - 使用 MSXML 拒绝访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1200311/