问题描述

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

posted on 2013-03-19 15:11  微软互联网开发支持  阅读(3457)  评论(0编辑  收藏  举报