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

原文: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来修复这个问题:

      码农单位的很多Windows服务器都会自动更新安装补丁,所以场景2中说的其它地市使用正常,其实是因为这些服务器已经打上了补丁,一些新上架、重装系统的服务器或自动更新没有设置的服务器就很可能会出现这类问题。。。
  如果对服务器没有操作权限或者不想打补丁这么麻烦,比如码农我,也可以在网站的根目录,新增一个浏览器定义文件,步骤如下:

1、添加一个"App_Browsers"文件夹 ;

2、添加一个"*.browser"后缀的文件,如 IE10.browser;

3、在文件中添加如下内容(下面的配置表示,对所有的设备和浏览器,都支持Cookies):

<browsers>
     <browser refID="Default">
          <capabilities><!-- To avoid wrong detections of e.g. IE10 -->
             <capability name="cookies" value="true" />
             <capability name="ecmascriptversion" value="3.0" />
          </capabilities>
      </browser>
 </browsers>  

这是针对某个站点的配置,如果既不想打补丁又想对服务器上的所有站点做全局配置,要如何处理呢?很容易,其实上面已经明示,问题是出在ie.browser 这个文件的配置上,所以我们只需在原来的基础上,加上这一串 "\d{2,}$",使ASP.NET 能识别IE10的User-Agent就可以了。修改后的配置如下:

<capability name="majorversion" 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 id="IE11Preview" parentID="Mozilla">
    <identification>
        <userAgent match="Trident/(?'layoutVersion'\d+).*rv:(?'revision'(?'major'\d+)(\.(?'minor'\d+)?))" />
        <userAgent nonMatch="MSIE" />
    </identification>
    <capabilities>
        <capability name="browser"              value="IE" />
        <capability name="layoutEngine"         value="Trident" />
        <capability name="layoutEngineVersion"  value="${layoutVersion}" />
        <capability name="isColor"              value="true" />
        <capability name="screenBitDepth"       value="8" />
        <capability name="ecmascriptversion"    value="3.0" />
        <capability name="jscriptversion"       value="6.0" />
        <capability name="javascript"           value="true" />
        <capability name="javascriptversion"    value="1.5" />
        <capability name="w3cdomversion"        value="1.0" />
        <capability name="ExchangeOmaSupported" value="true" />
        <capability name="activexcontrols"      value="true" />
        <capability name="backgroundsounds"     value="true" />
        <capability name="cookies"              value="true" />
        <capability name="frames"               value="true" />
        <capability name="javaapplets"          value="true" />
        <capability name="supportsCallback"     value="true" />
        <capability name="supportsFileUpload"   value="true" />
        <capability name="supportsMultilineTextBoxDisplay" value="true" />
        <capability name="supportsMaintainScrollPositionOnPostback" value="true" />
         <capability name="supportsVCard"        value="true" />
        <capability name="supportsXmlHttp"      value="true" />
        <capability name="tables"               value="true" />
        <capability name="supportsAccessKeyAttribute"    value="true" />
        <capability name="tagwriter"            value="System.Web.UI.HtmlTextWriter" />
        <capability name="vbscript"             value="true" />
        <capability name="revmajor"             value="${major}" />
        <capability name="revminor"             value="${minor}" />
    </capabilities>
</browser>

   三板斧搞定!

  幸福来的就是这么突然~~~ 

 

时间: 2024-09-10 02:42:18

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

IE10/IE11无法显示Flash怎么办

  IE11 Flash问题是不少Win8.Win8.1普通用户常遇到的麻烦事.从Win8开始,微软默认为IE浏览器集成Adobe Flash Player插件.之所以导致IE10/IE11 Flash问题,大多数来自IE浏览器安全权限以及系统问题. 这次,也整理Adobe官方修复IE10/IE11无法显示Flash问题方案(详情访问这里) 解决方案一.关闭IE10/IE11的Active刷选 功能 由于Adobe Flash Player IE版采用ActiveX控件加载方式运作,当IE10/

Win8/win8.1的IE10/IE11无法显示Flash怎么办?

  IE11 Flash问题是不少Win8.Win8.1的朋友常遇到的麻烦事.我们得知道--从Win8开始,微软默认为IE浏览器集成Adobe Flash Player插件.你看问题就来额,最近不少win8系统的朋友出现IE11不显示Flash以及IE11无法播放Flash?小便得告诉你的是---之所以导致IE10/IE11 Flash问题,大多数来自IE浏览器安全权限以及系统问题.那么,我们竟然知道额原因,又将如何解决了?接下来小便就提供了几种方法供你选择. Flash Player设置管理器

修复Win8/Win8.1下IE10/IE11不能显示Flash问题

  IE10/IE11不能显示Flash是很多win8/win8.1用户经常遇到的故障,引起这个故障的原因大多都是由IE浏览器的安全权限及系统的问题所造成的.用户要想解决这个问题可以参考下面ADOBE官方提出的几种修复方案. 解决方案一.关闭IE10/IE11的Active刷选功能 由于Adobe Flash Player IE版采用ActiveX控件加载方式运作,当IE10/IE11启用Active刷选功能后,Flash播放器将无法正常工作,另外,IE地址栏右侧也会显示一个蓝色禁止标识. 这时

IE9/IE10/IE11如何订阅网站RSS源

  一.什么是RSS.RSS源? 习惯刷微博.看微信的新读者,已逐渐忘记这项网络技术.但是,对于老用户.博客主以及大量网站来说,RSS仍然是举足轻重. RSS是一种描述和同步网站内容的格式,主要用于网上新闻频道,博客等站点.1997年由网景公司开发.读者用户订阅RSS源后,可以快速获取网站即时信息,也无需打开主网站,就可以阅读相关的网页资讯内容. 我们也可以把RSS比作20世纪初的"微博"."微信",实时向读者推送最新的网络信息. 二.如何订阅RSS源? 参考教程:

记录asp.net网站是什么原因导致停止运行的代码

 这篇文章主要介绍了记录asp.net网站是什么原因导致停止运行的具体实现 记录网站是什么原因导致停止运行还是有必要的,下面是具体的实现方式.  代码如下: protected void Application_End(object sender, EventArgs e)  {  RecordEndReason();  }    /// <summary>  /// 记录网站停止运行原因  /// </summary>  protected void RecordEndReaso

asp.net 网站运行很慢 很慢 为什么会这样 应该设置什么? 怎么设置呢?

问题描述 asp.net 网站运行很慢 很慢 为什么会这样 应该设置什么? 怎么设置呢? asp.net 网站运行很慢很慢 是什么原因? 应该设置什么? 怎么设置呢? 解决方案 这个原因多了去了,比如感染了360等流氓软件,甚至是cpu散热不好.重装系统看看,再不行就是硬件问题. 解决方案二: 是啊,这个原因多了去了,再问一下,你网站快过没有?所有人浏览你网站都慢吗?电信.移动都很慢吗?不是的话,那问题不在服务器.你服务器放在哪儿呢?国外?是的话,那正常.如果在国内,你可以访问一下同IP段其他网

c#-iis发布asp.net网站,手机使用流量输入公网域名无法访问,但是其他电脑可以

问题描述 iis发布asp.net网站,手机使用流量输入公网域名无法访问,但是其他电脑可以 win10搭建的iis,已做好了端口映射 1.如果手机和电脑都处在同一个路由器之下,那么是可以正常访问的,无论是输入公网地址还是我pc的内网地址.当然pc本身也是可以正常访问. 2.其他电脑输入公网地址也可以正常访问我的网站 3.但是手机使用流量却无法访问??? 求解?难道是手机运营商的问题吗?手机流量的网络和电脑又有什么区别吗?而为何百度这种网渣就可以正常的被手机使用流量访问到?是哪里的区别导致了这个结

ASP编程技术学习:Cookie集合

     Cookie是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个Web站点会话之间持久地保持数据.Request和Response对象都有一组Cookie. Request.cookie集合是一系列Cookie,从客户端与HTTP Request一起发送到Web服务器.反过来,如果你希望把Cookie发送到客户机,就可以使用Response.cookie 1.ExpiresAbsolute属性 该属性可以赋一个日期,过了这个日期Cookie就不能再被使用了.通过给E

asp.net中英切换-ASP.NET网站实现中英切换

问题描述 ASP.NET网站实现中英切换 请问用ASP.NET做的网站怎么实现中英切换的功能?求大神指点,多谢! 解决方案 http://www.cnblogs.com/wenjl520/archive/2010/10/17/1853367.htmlhttp://www.codeproject.com/Articles/38907/ASP-NET-Localization-Quick-Reference 解决方案二: 如何实现ASP.NET网站个性化在ASP.NET网站中实现带列表的视频播放在A