問題描述
IE通過代理服務器訪問網站時持續彈出認證對話框。
數據收集
通過Network Monitor從客戶段抓包,收集出錯情況和正常情況下網絡包進行對比如下,
出錯情況,可以看到頻繁返回401錯誤。
3891 HTTP HTTP:Request, GET http://www.mysite.com/ 3892 HTTP HTTP:Response, HTTP/1.1, Status: Unauthorized, URL: http://www.mysite.com/ , Using NTLM Authentication 4300 HTTP HTTP:Request, GET http://www.mysite.com/ , Using NTLM Authorization 4325 HTTP HTTP:Response, HTTP/1.1, Status: Unauthorized, URL: http://www.mysite.com/ 4333 HTTP HTTP:Request, GET http://www.mysite.com/ , Using NTLM Authorization 4357 HTTP HTTP:Response, HTTP/1.1, Status: Unauthorized, URL: http://www.mysite.com/ , Using NTLM Authentication 4625 HTTP HTTP:Request, GET http://www.mysite.com/ , Using NTLM Authorization 4642 HTTP HTTP:Response, HTTP/1.1, Status: Unauthorized, URL: http://www.mysite.com/ 4645 HTTP HTTP:Request, GET http://www.mysite.com/ , Using NTLM Authorization 4682 HTTP HTTP:Response, HTTP/1.1, Status: Unauthorized, URL: http://www.mysite.com/ , Using NTLM Authentication
成功情況
379 HTTP HTTP:Request, GET / 381 HTTP HTTP:Response, HTTP/1.1, Status: Unauthorized, URL: / , Using NTLM Authentication 385 HTTP HTTP:Request, GET / , Using NTLM Authorization 387 HTTP HTTP:Response, HTTP/1.1, Status: Unauthorized, URL: / 388 HTTP HTTP:Request, GET / , Using NTLM Authorization 391 HTTP HTTP:Response, HTTP/1.1, Status: Ok, URL: /
對比請求的tcp報文細節,發現出錯情況下端口在不斷的變化,
Tcp: Flags=...AP..., SrcPort=1330, DstPort=3128, PayloadLen=602, Seq=1411197225 - 1411197827, Ack=2764265843, Win=64796 (scale factor 0x0) = 64796 Tcp: Flags=...AP..., SrcPort=1334, DstPort=3128, PayloadLen=680, Seq=1674575172 - 1674575852, Ack=199562079, Win=65092 (scale factor 0x0) = 65092 Tcp: Flags=...AP..., SrcPort=1333, DstPort=3128, PayloadLen=896, Seq=1830100015 - 1830100911, Ack=1517275850, Win=65535 (scale factor 0x0) = 65535
問題根源
正常的IE NTLM認證過程如下,
1. IE向網站發送匿名訪問請求
2. 網站返回401通知客戶段需要NTLM認證
3. IE發送NTLM認證消息給服務器
4. 服務器再次回復401並提供16-byte隨機數
5. IE通過用戶密碼的哈希值對隨機數加密並發送給服務器
6. 服務器將用戶名和加密后的隨機數發送給域控制器(DC)驗證,如成功則返回請求頁面
在以上遇到的問題中,如果401頁面內容小於1460字節(1460字節為一個tcp數據報文的長度),IE可能會關閉當前連接,並試圖重用與代理服務器之前建立的活動連接(keep-alive pool)。但是由於代理服務器已經關閉了相應的與IIS服務器之間的連接,所以IIS會請求重新認證客戶端。從而導致401錯誤再次發生。
解決方案
解決該問題可以從客戶端或服務端入手,
從客戶端解決
修改注冊表以下鍵值(如果希望對所有本機用戶進行更改,選擇HKLM,如果只希望更改當前用戶,選擇HKCU)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings
添加ReleaseSocketDuring401Auth
類型DWORD
值0
從服務器解決
編輯401響應頁面,使其大於1460字節。
如果創建自定義出錯頁面可以參考以下文章
http://technet.microsoft.com/en-us/library/cc753103(v=WS.10).aspx
微軟互聯網開發支持專家
Zhixing