问题描述
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