5

在IIS中我有:IE/IIS集成身份驗證問題

http://myserver/myapplication
http://myserver/reports

報告應用程序是報告實際上它使用Windows身份驗證服務。 myapplication是一個使用表單身份驗證的asp.net應用程序。

服務器在公司域之外。如果我首先訪問報告並輸入用戶名和密碼(在服務器上創建的本地憑證),則系統會提示我可以訪問報告頁面,但沒有問題。如果我直接進入我的應用程序的登錄頁面並嘗試登錄,則登錄頁面會刷新而無需執行任何操作。這總是發生在IE 6中。在IE 7中它會間歇性地發生。不會在Firefox中發生,或者如果Fiddler在後臺運行,似乎可以即時解決問題。

我用wireshark查看發生了什麼,並發現IE 6將從報告應用程序獲取的Windows身份驗證令牌發送到myapp。這是IE和Firefox之間的唯一區別。 IIS似乎嚇壞了,只是將我的POST解釋爲登錄頁面作爲GET並返回。

如果我添加Windows身份驗證到IIS中的應用程序,一切似乎都適用於任何瀏覽器。

這是怎麼發生的?在IE中的錯誤,或者我錯過了什麼?

回答

13

這是一個在IE瀏覽器中的錯誤,並在通過HTTP的NTLM /協商(又名集成)身份驗證設計中的錯誤。

NTLM /協商是面向連接的身份驗證協議,HTTP並非真的爲此設計。因此,當您的服務器上的一個頁面需要此身份驗證機制時,IE通常會假定服務器上的其他頁面具有相同的要求。此外,出於性能和安全原因,如果IE 預期對給定POST請求的Negotiate/NTLM質詢,則它將首先發送0字節POST,期望服務器返回HTTP/401質詢它將進行身份驗證,然後正確發送POST正文。

然而,在你的情況下,不需要集成認證的文件夾獲得0字節的POST,並說「Hrm,很奇怪,一個0字節的文章好吧,HTTP/200,這裏的網頁,就像你會使用GET「。

因爲IE永遠不會收到它期望的401挑戰,它實際上永遠不會發送POST正文。

(由於HTTP連接重用的工作方式,提琴手可能會讓你感到困惑)。

解決方法是確保如果您在主機上使用集成身份驗證,請在任何地方使用它。

+0

謝謝埃裏克,這是什麼修復? IE應該像Firefox一樣發送整個POST消息,對吧?我想IE 8的作品,還沒有測試過。 – 2009-10-10 17:35:53