ASP.NET4中不要相信Request.Browser.Cookies,“.NET研究”Form验证要用UseCookies
2011-10-15 19:51
323 查看
从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
打开这个文件夹一看:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/11/fab497a46c72e91da6f0206a57f6bdaf.jpg)
眼前一亮,迫不及待地打开safari.browser:
[url=http://images.cnblogs.com/cnblogs_com/dudu/201103/201103061552312085.jpg]上海徐汇企业网站制作ck; margin-left: auto; margin-right: auto;" title="2" src="http://images.cnblogs.com/cnblogs_com/dudu/201103/201103061552358067.jpg" border="0" alt="2" width="649" height="57上海闵行企业网站制作4" /> 呵呵,原来真相躲在这里。稍微分析一下这个文件,就能知道:
遨游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
上海闵行企业网站设计与制作lock; margin-left: auto; margin-right: auto;" title="3" src="http://images.cnblogs.com/cnblogs_com/dudu/201103/20110306155238245.jpg" border="0" alt="3" width="600" height="131" /> 搞定!终于真相大白,不枉一场折腾。
如果不写这篇随笔,可能加上cookieless="UseCookies"就完事,不会有接下来的深入研究。
当你有一个收获,通过博客写出来之后,不仅加深了这个收获,很多时候你还会有意外的收获...
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
打开这个文件夹一看:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/11/fab497a46c72e91da6f0206a57f6bdaf.jpg)
眼前一亮,迫不及待地打开safari.browser:
[url=http://images.cnblogs.com/cnblogs_com/dudu/201103/201103061552312085.jpg]上海徐汇企业网站制作ck; margin-left: auto; margin-right: auto;" title="2" src="http://images.cnblogs.com/cnblogs_com/dudu/201103/201103061552358067.jpg" border="0" alt="2" width="649" height="57上海闵行企业网站制作4" /> 呵呵,原来真相躲在这里。稍微分析一下这个文件,就能知道:
遨游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
上海闵行企业网站设计与制作lock; margin-left: auto; margin-right: auto;" title="3" src="http://images.cnblogs.com/cnblogs_com/dudu/201103/20110306155238245.jpg" border="0" alt="3" width="600" height="131" /> 搞定!终于真相大白,不枉一场折腾。
如果不写这篇随笔,可能加上cookieless="UseCookies"就完事,不会有接下来的深入研究。
当你有一个收获,通过博客写出来之后,不仅加深了这个收获,很多时候你还会有意外的收获...
相关文章推荐
- ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies
- 一起谈.NET技术,ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies
- [转帖]ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies
- ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies
- ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies
- ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies
- ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies
- ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies
- 不要在using语句中“.NET研究”调用WCF服务
- discuz ASP.NET 4.0验证请求 A potentially dangerous Request.Form value was detected from the client
- csharp: Request.Form,Request.QueryString,Request.Params,Request.Cookies
- .net中“检测到有潜在危险的 Request.Form 值”错误解决方法
- .Net 下对 FCKeditor Js提取,后台Request.Form提取[原创]
- Laravel中使用FormRequest进行表单验证及对验证异常进行自定义处理
- .NET 关于从客户端(...)中检测到有潜在危险的Request.Form 值的处理办法 找不到方法:System.Web.UnvalidatedRequestValues报错的处理方案(待完善)
- 客户端中检测到有潜在危险的Request.Form 值的处理办法 VS2010 .NET 4.0
- 解决.Net 4.0 A potentially dangerous Request.Form value was detected from the client 异常
- 解决.Net 4.0 A potentially dangerous Request.Form value was detected from the client 异常
- 选择.Net培训学员要实地考察不要相信广告
- 验证.N“.NET研究”ET强命称的思路和实例