我在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
答案 0 :(得分:2)
似乎我找到了一种方法来保持需要Windows身份验证的页面和允许在一个站点上匿名访问的页面。
有两种方法可以做到:
此行为(错误)仅在使用NTLM身份验证时重现。因此,为了避免它,我们可以在IIS站点上设置Kerberos身份验证模式。以下是有关IIS和Kerberos的详细常见问题解答:http://www.adopenstatic.com/faq/
告诉我,我试图遵循第一种方式,但我的IIS确实不想使用Kerberos。另一方面,我尝试在另一台机器上检查这种情况 - 并且很惊讶 - 默认情况下使用Kerberos身份验证。我试图找到配置上的任何差异 - 但不成功。所以有第二种方式:
在单独目录中的目录或文件上使用Windows身份验证模式。例如,我们有一些结构,如:
我们可以在'auth'目录或DefaultWinAuth页面上设置IWA(集成Windows身份验证)模式。之后,此文件夹中包含的或与“DefaultWinAuth.aspx”页面位于同一级别的所有文件和子目录将无法接收POST数据。但目录'auth'之外的所有其他文件和目录都可以正常工作。
答案 1 :(得分:1)
我有这个确切的问题,显然它是在IE设计中,看看这个链接: http://www.websina.com/bugzero/kb/browser-ie.html
如果您当前在经过身份验证的URL /页面上,IE基本上不会将POST数据发送到未经身份验证的URL /页面。我没有找到解决办法,我不得不做其他事情,但是如果你想办法,请告诉我。干杯