IE通過代理訪問網站持續提示需要身份驗證


問題描述

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM