ASP.NET4中不要相信Request.Browser.Cookies,“.NET研究”Form验证要用UseCookies

  从ASP.NET 3.5升级至ASP.NET4之后,遇到三种登录后不能保存cookie的情况(升级前一切正常):

  1. 遨游3在极速模式下(默认模式)。

  2. FireFox中修改了UserAgent上海徐汇企业网站设计与制作

  3. 诺基亚手机自带浏览器或者UCWeb浏览器访问博客园手机版(m.cnblogs.com)。

  今天终于把罪魁祸首给揪出来了,它就是Request.Browser.Cookies。

  如果你在程序中使用Form验证并使用cookie保存用户的登录状态,请切记:在<authentication mode="Forms">/<forms>中要加上cookieless="UseCookies"。如果不这样设置的话,cookieless会使用默认值UseDeviceProfile。用了UseDeviceProfile,悲剧就发生了,ASP.NET会根据Request.Browser.Cookies来判断当前浏览器是否支持Cookie(如若不信,请用Reflector查看System.Web.Security.FormsAuthentication的代码)。而Request.Browser.Cookies会认为上面的三种情况不支持cookie(可能还有更多误判的情况)。

  而在ASP.NET 3.5及ASP.NET 2.0不存在这样的误判。不信的话,大家用下面的代码验证一下:

  Response.Write(Request.Browser.Cookies);

  用遨游3在极速模式下访问,若是ASP.NET4,则显示False;若是ASP.NET 3.5,则显示True。

  本来准备写到这里就结束,但是在写的过程中,觉得不甘心,被这个折腾的差点崩溃,一定要看个究竟,ASP.NET4凭什么认为遨游3不支持cookie。

  1)先用下面的代码看一下ASP.NET4把遨游3当成什么浏览器:上海企业网站设计与制作

  Response.Write(Request.Browser上海网站建设.Browser);

  答案是:Safari

  难道微软在这里搞了小花招,只要是Safari,故意认为它不支持cookie。

  但用正宗的Safari测试了一下,Request.Browser.Cookies返回True。冤枉微软了,微软也不会这么小家子气。

  2) 再用Request.UserAgent看一下遨游3的UserAgent:

  结果是:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.9 (KHTML, like Gecko) Maxthon/3.0 Safari/533.9

  双核浏览器是果然不同反响。难道是复杂的UserAgent让ASP.NET4很恼火:谁家的浏览器这么复杂,干脆判定你不支持cookie。

  3) 接下来是关键的一步,找出ASP.NET4根据什么判断当前浏览器是否支持cookie?可以确定的是,不是抛硬币抛出来的。

  用Reflector看源代码,看得头昏脑胀,也没找到答案。算了,那就用杀手锏——猜测法。嘿嘿,这招竟然管用。

  原来ASP.NET4是根据下面的文件夹中的数据进行判断的:

  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Browsers

  打开这个文件夹一看:

  眼前一亮,迫不及待地打开safari.browser:

  呵呵,原来真相躲在这里。稍微分析一下这个文件,就能知道:

  遨游3匹配的是第一项(也就是<browser id="Safari" parentID="Mozilla">部分),这项配置中没有设置cookies=true。

  而正宗的Safari不仅匹配了第一项,还匹配了第二项,(也就是<browser id="Safari3to4" parentID="Safari">部分)这里设置了<capability name="cookies"  value="true" />。

  果然是遨游3“冒充”别人家的浏览器造成的,微软没想到会出现这样的的UserAgent。

  找到真相,问题就容易解决了。开始以为只要在第一项中加<capability name="cookies" value="true" />就行了,但没这么简单:

  1. safari.browser文件修改不能保存,提示说是只读文件。解决方法是:将safari.browser复制到其他地方,改好后,再复制回来,覆盖现有文件。

  2. 要以管理员身份运行下面的命令将这些.browser文件编译成程序集并安装到GAC中:

  C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regbrowsers.exe –i

  搞定!终于真相大白,不枉一场折腾。

  如果不写这篇随笔,可能加上cookieless="UseCookies"就完事,不会有接下来的深入研究。

  当你有一个收获,通过博客写出来之后,不仅加深了这个收获,很多时候你还会有意外的收获...

时间: 2024-11-19 12:06:25

ASP.NET4中不要相信Request.Browser.Cookies,“.NET研究”Form验证要用UseCookies的相关文章

一起谈.NET技术,ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies

从ASP.NET 3.5升级至ASP.NET4之后,遇到三种登录后不能保存cookie的情况(升级前一切正常): 1. 遨游3在极速模式下(默认模式). 2. FireFox中修改了UserAgent. 3. 诺基亚手机自带浏览器或者UCWeb浏览器访问博客园手机版(m.cnblogs.com). 今天终于把罪魁祸首给揪出来了,它就是Request.Browser.Cookies. 如果你在程序中使用Form验证并使用cookie保存用户的登录状态,请切记:在<authentication mo

通过代码理解Asp.net4中的几种ClientIDMode设置.

以前我们可以通过ClientID在JavaScript脚本中服务器端控件.比如: document.getElementById("<%=控件.ClientID %>"); 这种方式不方便,而且如果在有数据绑定的控件中嵌套着子控件,则访问更不太方便了. 现在,在Asp.Net4中,对于控件增加了一种新的属性,名为ClientIDMode.通过设置ClientIDMode,我们可以指定各个服务器控件如何生成ClientID,以便我们在客户端脚本中方便使用.具体如下: 1.  

ASP.NET中利用cookies保持客户端信息

asp.net|cookie|cookies|客户端 我当前所吃的东东都固定为食物,所以一点也不惊讶,这一周的主题为cookies. Cookies用于存储特定用户信息,它提供了Web程序中一种有用的方式.多年以来,JavaScript开发人员已经进行了有关cookie的大量工作.同样,ASP.NET通过System.Web空间名称也提供了cookie的访问.虽然你不应该使用cookie来存储一些敏感性的数据,但是,它们是处理锁细数据的一个极好的选择,比如颜色参数选择或者最后一次访问日期. 传递

session和cookies在ASP.net中同时使用 举例

问题描述 session和cookies在ASP.net中同时使用 举例 session和cookies在ASP.n中同时使用 举例 我不知道该怎么同时使用 我现在弄了个 自动判断浏览器语言 和可以自己选择语言 也可以根据cookies保存的 就是现在想联合session一起使用 解决方案 这两者互不相干,分别都使用就是同时使用了.http://blog.csdn.net/wangjingjing1014/article/details/8805263http://blog.csdn.net/y

asp.net-ASP.NET中Request.Browser.IsMobileDevice能用来判断移动设备吗?

问题描述 ASP.NET中Request.Browser.IsMobileDevice能用来判断移动设备吗? ASP.NET中Request.Browser.IsMobileDevice能用来判断客户端是不是移动设备吗?所有的移动设备都能检测出来吗? 解决方案 用js可以判断. 你可以通过js判断.

Asp.Net4.0/VS2010新变化(3):webform中也可以直接url路由

以前在做asp的时候,要把 /default.asp?id=123映射成/default/123,需要借助IISRewriter这个组件,到了asp.net以后,可以用代码写了,但是个人觉得很麻烦,要写一堆代码,还要修改web.config,现在好了:asp.net4.0中 asp.net mvc中的路由规则全部可以用于webform了   使用步骤: 1.Global.ascx.cs中先注册路由规则 using System; using System.Web.Routing; namespa

asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误

在提交表单时候,asp.net 提示:"从客户端(......)中检测到有潜在危险的 Request.Form 值" .asp.net中的请求验证特性提供了某一等级的保护措施防止XSS攻击,asp.net的请求验证是默认启动的.这个给出各个版本.net的解决方法. asp.net 2.0 通常解决办法 方案一: 将.aspx文件中的page项添加ValidateRequest="false" ,如下: <%@ Page ValidateRequest=&quo

asp.net中“从客户端中检测到有潜在危险的Request.Form值”错误的解决办法_实用技巧

在提交表单时候,asp.net 提示:"从客户端(......)中检测到有潜在危险的 Request.Form 值" .asp.net中的请求验证特性提供了某一等级的保护措施防止XSS攻击,asp.net的请求验证是默认启动的. 这里给出不同版本.net的解决方法. asp.net 2.0 通常解决办法 方案一: 将.aspx文件中的page项添加ValidateRequest="false" ,如下: <%@ Page ValidateRequest=&qu

尝尝ASP.NET中的小甜饼

asp.net Cookie对于使用过ASP的读者来讲并不陌生,但是我们要讲的是在ASP.NET中的Cookie.我们知道,Cookie存在于用户计算机浏览器中,我们可以使用Cookie来存放一些很简单的数据.但是,有一点别说我没提醒你:记住这不是个好办法,因为用户可以在任何时间删除Cookie信息,也可以关闭Cookie功能.好了,开场白就这些. 使用ASP.NET我们可以很容易的对Cookie集合进行操作.它和ASP中的Cookie一样,都是附属于Request和Response对象的.Li