在经典ASP站点中使用WinHttp.WinHttpRequest.5.1时出现HTTP错误401.1

时间:2012-05-31 09:18:10

标签: asp-classic ntlm winhttprequest

一般信息

操作系统:Windows Server 2003 R2 Service Pack 2

网络服务器:IIS 6

NTAuthenticationProviders :仅限NTLM

Web应用:经典ASP

浏览器使用:IE7,IE8,IE9

在一个名为 eblcplaza 的IIS网站中有一个名为 knowledgebase 的经典ASP网络应用程序,如下所示:eblcplaza / knowledgebase /。

eblcplaza启用了匿名访问和集成Windows身份验证。 知识库禁用匿名访问并启用集成Windows身份验证

知识库是一个经典ASP应用程序有自己的应用程序池,它在预定义的应用程序池标识“网络服务”下运行

当我使用我的NT帐户登录时,我可以访问任何我想要的页面。问题出在WinHttp.WinHttpRequest.5.1组件上。它在知识库的某些部分中用于执行服务器端请求,以从驻留在Web应用程序中的某些.asp脚本中检索内容。

在知识库中关闭匿名访问时,问题就开始了。 注意,重新打开它不是一个选项。

使用WinHttpRequest的请求示例:

set WinHTTPRequest = Server.CreateObject("WinHttp.WinHttpRequest.5.1")

WinHTTPRequest.SetTimeouts 20000, 20000, 20000, 20000

call WinHTTPRequest.Open("POST", someUrlToAspScript, false) 

WinHTTPRequest.SetAutoLogonPolicy 0                 

WinHTTPRequest.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

WinHTTPRequest.Send strQueryString

Response.Write(WinHTTPRequest.ResponseText)

将SetAutoLoginPolicy设置为0,我在使用WinHttpRequest的页面上收到以下错误消息:

您无权使用您提供的凭据查看此目录或页面。 HTTP错误401.1 - 未经授权:由于凭据无效,访问被拒绝。 Internet信息服务(IIS)

将SetAutoLoginPolicy设置为2(不根据MSDN自动发送用户凭据),我在使用WinHttpRequest的页面上收到以下错误消息:

您无权使用您提供的凭据查看此目录或页面,因为您的Web浏览器正在发送Web服务器未配置为接受的WWW-Authenticate标头字段。 HTTP错误401.2 - 未经授权:由于服务器配置,访问被拒绝。

我知道我的NT用户帐户有权访问这些.asp脚本,网络服务帐户也是如此。

我试着找出问题可能已经好几天知道了,尝试将NTAuthenticationProviders设置为仅NTLM以及Negotiate和NTLM等等,但到目前为止没有任何工作。

请帮助我,它开始让我发疯。

此致

巴特

2 个答案:

答案 0 :(得分:0)

我猜知识库中的页面是使用匿名帐户访问的,您可以从eblcplaza开始。尝试仅在您使用请求的eblcplaza页面上启用NTLM,您只能在该文件上执行此操作。就像你的凭据传递给知识库一样。在两个页面上都记录会话(“用户名”)变量。

答案 1 :(得分:0)

首先让我们清楚一下你要求服务器做什么。它将要求客户提供您的凭据,以便出于安全目的而冒充您的身份。它正在向服务发出的WinHTTP请求(WinHTTP不知道它是完全相同的应用程序)现在需要凭据。您希望此模拟线程执行的操作是使用您的信用卡对“外部”服务进行身份验证。

我怀疑这里发生的事情是服务器无法以这种方式重新使用您的凭据。如果我没记错(可能不是那么确定),服务器需要被授予委派权以便这样做。如果使用Kerberos而不是NTLM来执行Windows集成安全性,也可以允许这样做。

然而,所有这些都可能是学术性的。你应该明白,一个向自己发出http请求的应用程序有可能在加载时以一种需要循环释放的方式挂起。

考虑这个选择。鉴于ServicePage.asp是浏览器和内部ClientPage.asp直接使用的页面,请执行以下操作。

从ServicePage.asp中删除服务代码,并将其放在新的ServiceInclude.asp中的VBScript类中。现在将此ServiceInclude.asp添加为ServicePage.asp中的包含文件,其中ServicePage.asp仅包含实例化类所需的管道并使用它来生成其输出。

修改ClientPage.asp,以便不是尝试WinHttp到ServicePage.asp,而是简单地包含ServiceInclude.asp,实例包含的类并使用该类来提供所需的服务。