使用XMLHttpRequest对象发送POST请求时为什么Content-Length为0?

时间:2009-08-06 12:12:23

标签: windows internet-explorer iis authentication xmlhttprequest

我在IIS 5.1上有一个带有两个aspx页面的虚拟目录。已启用对配置为“集成Windows身份验证”选项的Page1的访问,并禁用匿名访问。第2页可通过匿名访问获得。在客户端,有一个XmlHttpRequest对象,可以将包含POST数据的请求发送到此页面。

首先我尝试向Page1发送请求。出现标准Windows身份验证对话框,输入我的凭据,Page1成功接收POST数据。 之后,我尝试向可以匿名访问的Page2发出相同的POST请求。在这种情况下,Request的标题Content-Length = 0,并且没有任何数据被发送。

如果要重复对Page1的请求 - 它成功接收POST数据。相同的代码在Firefox 3.5中运行良好。即使在向Windows身份验证请求发送请求后,Page2也可以接收数据。有什么不对?也许这是解决这个问题的方法吗?

谢谢!

发送数据:

function sendRequest() {
  var url = "http://tom/AuthTest/Default.aspx";
  var data = "data";
  reqSend(url, data);
}

function sendRequestToWinAuth() {
  var url = "http://tom/AuthTest/DefaultWA.aspx";
  var data = "newdata";
  reqSend(url, data);
}

function reqSend(url, data) {
  var xmlhttp = createRequestObject();
  if (!xmlhttp) {
    alert("Cannot create XMLHttpRequest object.");
    return;
  }
  try {
    xmlhttp.open("POST", url, false);
    xmlhttp.send(data);
  }
  catch (ex) {
    alert("Error: " + ex.message);
  }
}

请求Page1:

POST /AuthTest/DefaultWA.aspx HTTP/1.1
Accept: */*
Referer: http://tom/AuthTest/client/testauth.html
Accept-Language: ru
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Host: tom
Content-Length: 7
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: innovator_user=admin
Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAF4AAAAYABgAdgAAAAoACgBIAAAABgAGAFIAAAAGAAYAWAAAAAAAAACOAAAABYKIogUBKAoAAAAPcwBjAGEAbgBkAHQAbwBtAFQATwBNAGUdQIkWMQ6PAAAAAAAAAAAAAAAAAAAAAAo3goJdI7RH9poJwnjypksH2F2pIzbEOQ==

newdata

请求Page2:

POST /AuthTest/Default.aspx HTTP/1.1
Accept: */*
Referer: http://tom/AuthTest/client/testauth.html
Accept-Language: ru
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Host: tom
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: innovator_user=admin
Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFASgKAAAADw==
Content-Length: 0

2 个答案:

答案 0 :(得分:2)

似乎我找到了一种方法来保持需要Windows身份验证的页面和允许在一个站点上匿名访问的页面。

有两种方法可以做到:

  1. 此行为(错误)仅在使用NTLM身份验证时重现。因此,为了避免它,我们可以在IIS站点上设置Kerberos身份验证模式。以下是有关IIS和Kerberos的详细常见问题解答:http://www.adopenstatic.com/faq/

    告诉我,我试图遵循第一种方式,但我的IIS确实不想使用Kerberos。另一方面,我尝试在另一台机器上检查这种情况 - 并且很惊讶 - 默认情况下使用Kerberos身份验证。我试图找到配置上的任何差异 - 但不成功。所以有第二种方式:

  2. 在单独目录中的目录或文件上使用Windows身份验证模式。例如,我们有一些结构,如:

    • ../ Default.aspx的
    • ../ AUTH / DefaultWinAuth.aspx
    • ../ AUTH / DefaultWinAuth2.aspx

    我们可以在'auth'目录或DefaultWinAuth页面上设置IWA(集成Windows身份验证)模式。之后,此文件夹中包含的或与“DefaultWinAuth.aspx”页面位于同一级别的所有文件和子目录将无法接收POST数据。但目录'auth'之外的所有其他文件和目录都可以正常工作。

答案 1 :(得分:1)

我有这个确切的问题,显然它是在IE设计中,看看这个链接: http://www.websina.com/bugzero/kb/browser-ie.html

如果您当前在经过身份验证的URL /页面上,IE基本上不会将POST数据发送到未经身份验证的URL /页面。我没有找到解决办法,我不得不做其他事情,但是如果你想办法,请告诉我。干杯