【问题标题】:Why Content-Length is 0 while sending POST request with XMLHttpRequest object?为什么使用 XMLHttpRequest 对象发送 POST 请求时 Content-Length 为 0?
【发布时间】:2010-11-17 07:57:36
【问题描述】:

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

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

如果向 Page1 重复请求 - 它成功接收 POST 数据。相同的代码在 Firefox 3.5 中运行良好。即使向需要 Windows 身份验证的 Page1 发送请求,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);
  }
}

请求第 1 页:

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

请求第 2 页:

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

【问题讨论】:

标签: windows internet-explorer iis authentication xmlhttprequest


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复,这对我来说很有用。但我发现了一件有趣的事情。如果 IIS 服务器位于远程计算机上,则将数据发布到未经身份验证的页面在 IE 中成功运行。它不仅仅在本地机器上工作。我认为这应该是由于在远程机器上使用 Kerberos 身份验证和在本地机器上使用基本 NTLM 身份验证引起的。所以出现了新问题——是否有任何方法可以在本地机器上使用 Kerberos 而不是 NTLM?
  • IE 不允许服务器请求 Kerberos。客户端可能在客户端计算机上禁用了“启用 Windows 集成身份验证”,并且这些客户端在协商时会尝试使用 NTLM。最简单的解决方法是要求对两个页面进行身份验证。
【解决方案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”之外的所有其他文件和目录都可以正常工作。

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2018-11-02
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多