3

我有一個虛擬目錄在IIS 5.1上有兩個aspx頁面。訪問配置爲「集成Windows身份驗證」選項的Page1打開並禁用匿名訪問。第2頁通過匿名訪問提供。在客戶端,有XmlHttpRequest對象,可以將包含POST數據的請求發送到此頁面。爲什麼在使用XMLHttpRequest對象發送POST請求時Content-Length爲0?

起初我嘗試發送請求到Page1。出現標準Windows身份驗證對話框,我輸入我的憑據並Page1成功接收POST數據。 之後,我嘗試對匿名訪問的Page2發出相同的POST請求。在這種情況下,請求的頭部Content-Length = 0,並且沒有發送任何數據。

如果向Page1重複請求 - 它成功接收POST數據。相同的代碼在Firefox 3.5中運行良好。即使在向Windows發送請求後,Page2仍然可以接收數據。Page1。什麼可能是錯誤的?也許這是解決這個問題的方法嗎?

謝謝!

發送數據:

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 
+0

我認爲這涉及到http://stackoverflow.com/questions/328281/why-content-length-0-in-post-requests – Janning 2011-04-01 13:46:47

回答

1

似乎我找到了一種方法來保持頁面需要Windows身份驗證和頁面允許在一個網站上匿名訪問。

有2種方法來做到這一點:使用NTLM身份驗證時

  1. 這種行爲(錯誤)只繁殖。所以爲了避免它,我們可以在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

我有這個確切的問題,顯然它在IE瀏覽器的設計,看看這個鏈接: http://www.websina.com/bugzero/kb/browser-ie.html

基本上,如果您當前位於已驗證的URL /頁面上,IE將不會將POST數據發送到未經身份驗證的URL /頁面。我沒有找到解決辦法,我不得不做其他事情,但是如果你確實找到了方法,請告訴我。乾杯

+0

感謝ü的答覆,對我來說是非常有用的鏈接。但我發現一件有趣的事情。如果IIS服務器位於遠程計算機上,則將數據發佈到在IE中成功運行的未經身份驗證的頁面。它不適用於本地機器。我認爲它應該是在遠程計算機上使用Kerberos身份驗證以及本地上的基本NTLM身份驗證引起的。因此出現新的問題 - 如果有任何方法可以在本地機器上使用Kerberos代替NTLM? – Vitaly 2009-08-06 13:42:49

+0

IE不允許服務器要求Kerberos。 客戶端可能在客戶端計算機上禁用「啓用Windows集成身份驗證」,並且這些客戶端將在嘗試協商時嘗試使用NTLM。 最簡單的解決方法是要求對兩個頁面進行驗證。 – EricLaw 2009-08-07 01:35:58

相關問題