IE10、IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题

发布时间:2026/7/4 13:54:50

IE10、IE11 User-Agent 导致的 ASP.Net 网站无法写入Cookie 问题 你是否遇到过当使用一个涉及到Cookie操作的网站或者管理系统时IE 6、7、8、9下都跑的好好的唯独到了IE10、11这些高版本浏览器就不行了好吧这个问题码农连续2天内遇到了2次。那么我们就来看看这个问题的前因后果。先说下这2次的使用场景一次是在某页面中先存Cookie然后再入库记录相关数据但是发布到生产环境后入库操作没有发生后来通过打印日志发现问题卡在这里if (Request.Browser.Cookies)也就是说在客户端是IE10的环境下这里返回False纳尼IE10默认配置下不支持Cookie微软你玩我的吧。第二次是某地市的升级测试在IE10的环境下自服务网站登录失败这个问题很奇怪因为之前已经升级过多个地市了IE10使用都正常。这极大的引起了码农的兴趣由此引出了此文。描述完场景我们就来分析分析。虽然直觉告诉码农可能是Cookie的读取或写入有问题但毕竟直觉这玩意儿不靠谱咱还是得用事实和证据说话。国际惯例先抓个HTTP包瞧瞧上图是IE10下登录失败时服务端返回的HTTP响应头下图是其它浏览器正常登录时服务端返回的HTTP响应头注意红色框框标注部分导致问题的直接原因很清晰了吧服务器响应请求时没有回发 Set-Cookie 头没有这个头客户端浏览器就无法写入Cookie。所以基于Form认证(在Cookie中会存入加密票据)的自服务网站会无法登录。这时你可能会觉得奇怪了为啥只有IE10、IE11 会这样其它IE浏览器跑的妥妥的呢嗯为了满足你的好奇心我们继续分析。如果你的机器上装了.NET的FrameWork打开这个目录 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Browsers。科普下文件夹里面的.browser文件是全局访问的用于标识发出请求的浏览器并标识这些浏览器具备的功能。如果要做定制修改(比如针对特定移动设备)只需把相应的.browser文件复制到应用程序的\App_Browsers文件夹中修改即可。先用记事本打开 ie.browser 这个文件注意图中标注为红色部分的正则表达式然后再来看看微软公布的IE10的User-Agent :Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)MSIE版本号由以前的1位数字(5-9)变成了现在的2位数字(10)很明显无法匹配上面的正则了吧。所以由于无法正确识别IE10的User-Agent所以ASP.NET把它看做是未知的浏览器认为它不支持Cookie由此而产生了一系列与Cookie相关的问题。问题的根本总算是知道了那么该如何解决呢其实这个问题已经经过微软官方确认是IE10的Bug其实也可以认为是ASP.NET 2.0、3.5、4.0的Bug因这些版本都无法识别 IE10的User-Agent。微软专门发布了HOTFIX来修复这个问题:KB2600088: Hotfix 适用在 Microsoft.NET Framework 4.0 中的 ASP.NETKB2608565: Hotfix 适用在 .NET Framework 3.5.1 中的 ASP.NETKB2600100: Hotfix 适用在 .NET Framework 3.5 SP1 与 .NET Framework 2.0 SP2 中的 ASP.NET码农单位的很多Windows服务器都会自动更新安装补丁所以场景2中说的其它地市使用正常其实是因为这些服务器已经打上了补丁一些新上架、重装系统的服务器或自动更新没有设置的服务器就很可能会出现这类问题。。。如果对服务器没有操作权限或者不想打补丁这么麻烦比如码农我也可以在网站的根目录新增一个浏览器定义文件步骤如下1、添加一个App_Browsers文件夹 2、添加一个*.browser后缀的文件如 IE10.browser3、在文件中添加如下内容(下面的配置表示对所有的设备和浏览器都支持Cookies):browsers browser refIDDefault capabilities!-- To avoid wrong detections of e.g. IE10 -- capability namecookies valuetrue / capability nameecmascriptversion value3.0 / /capabilities /browser /browsers这是针对某个站点的配置如果既不想打补丁又想对服务器上的所有站点做全局配置要如何处理呢很容易其实上面已经明示问题是出在ie.browser 这个文件的配置上所以我们只需在原来的基础上加上这一串 \d{2,}$使ASP.NET 能识别IE10的User-Agent就可以了。修改后的配置如下capability namemajorversion match^[6-9]|\d{2,}$ /修改完后再到命令行下将修改后的 .browser 文件编译成程序集并安装到GAC中如果是Windows Server 2008、Win7要以管理员身份运行命令行C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regbrowsers.exe -i如果是IE11由于其User-Agent Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko 变化更大所以需把下面这串加入来做匹配!-- Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko -- browser idIE11Preview parentIDMozilla identification userAgent matchTrident/(?layoutVersion\d).*rv:(?revision(?major\d)(\.(?minor\d)?)) / userAgent nonMatchMSIE / /identification capabilities capability namebrowser valueIE / capability namelayoutEngine valueTrident / capability namelayoutEngineVersion value${layoutVersion} / capability nameisColor valuetrue / capability namescreenBitDepth value8 / capability nameecmascriptversion value3.0 / capability namejscriptversion value6.0 / capability namejavascript valuetrue / capability namejavascriptversion value1.5 / capability namew3cdomversion value1.0 / capability nameExchangeOmaSupported valuetrue / capability nameactivexcontrols valuetrue / capability namebackgroundsounds valuetrue / capability namecookies valuetrue / capability nameframes valuetrue / capability namejavaapplets valuetrue / capability namesupportsCallback valuetrue / capability namesupportsFileUpload valuetrue / capability namesupportsMultilineTextBoxDisplay valuetrue / capability namesupportsMaintainScrollPositionOnPostback valuetrue / capability namesupportsVCard valuetrue / capability namesupportsXmlHttp valuetrue / capability nametables valuetrue / capability namesupportsAccessKeyAttribute valuetrue / capability nametagwriter valueSystem.Web.UI.HtmlTextWriter / capability namevbscript valuetrue / capability namerevmajor value${major} / capability namerevminor value${minor} / /capabilities

相关新闻