一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

ASP.NET4中不要相信Request.Browser.Cookies,F(xiàn)orm驗(yàn)證要用UseCookies

  從ASP.NET 3.5升級(jí)至ASP.NET4之后,遇到三種登錄后不能保存cookie的情況(升級(jí)前一切正常):

  1. 遨游3在極速模式下(默認(rèn)模式)。

  2. FireFox中修改了UserAgent。

  3. 諾基亞手機(jī)自帶瀏覽器或者UCWeb瀏覽器訪問(wèn)博客園手機(jī)版(m.cnblogs.com)。

  今天終于把罪魁禍?zhǔn)捉o揪出來(lái)了,它就是Request.Browser.Cookies。

  如果你在程序中使用Form驗(yàn)證并使用cookie保存用戶的登錄狀態(tài),請(qǐng)切記:在<authentication mode="Forms">/<forms>中要加上cookieless="UseCookies"。如果不這樣設(shè)置的話,cookieless會(huì)使用默認(rèn)值UseDeviceProfile。用了UseDeviceProfile,悲劇就發(fā)生了,ASP.NET會(huì)根據(jù)Request.Browser.Cookies來(lái)判斷當(dāng)前瀏覽器是否支持Cookie(如若不信,請(qǐng)用Reflector查看System.Web.Security.FormsAuthentication的代碼)。而Request.Browser.Cookies會(huì)認(rèn)為上面的三種情況不支持cookie(可能還有更多誤判的情況)。

  而在ASP.NET 3.5及ASP.NET 2.0不存在這樣的誤判。不信的話,大家用下面的代碼驗(yàn)證一下:

  Response.Write(Request.Browser.Cookies);

  用遨游3在極速模式下訪問(wèn),若是ASP.NET4,則顯示False;若是ASP.NET 3.5,則顯示True。

  本來(lái)準(zhǔn)備寫到這里就結(jié)束,但是在寫的過(guò)程中,覺(jué)得不甘心,被這個(gè)折騰的差點(diǎn)崩潰,一定要看個(gè)究竟,ASP.NET4憑什么認(rèn)為遨游3不支持cookie。

  1)先用下面的代碼看一下ASP.NET4把遨游3當(dāng)成什么瀏覽器:

  Response.Write(Request.Browser.Browser);

  答案是:Safari

  難道微軟在這里搞了小花招,只要是Safari,故意認(rèn)為它不支持cookie。

  但用正宗的Safari測(cè)試了一下,Request.Browser.Cookies返回True。冤枉微軟了,微軟也不會(huì)這么小家子氣。

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

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

  雙核瀏覽器是果然不同反響。難道是復(fù)雜的UserAgent讓ASP.NET4很惱火:誰(shuí)家的瀏覽器這么復(fù)雜,干脆判定你不支持cookie。

  3) 接下來(lái)是關(guān)鍵的一步,找出ASP.NET4根據(jù)什么判斷當(dāng)前瀏覽器是否支持cookie?可以確定的是,不是拋硬幣拋出來(lái)的。

  用Reflector看源代碼,看得頭昏腦脹,也沒(méi)找到答案。算了,那就用殺手锏——猜測(cè)法。嘿嘿,這招竟然管用。

  原來(lái)ASP.NET4是根據(jù)下面的文件夾中的數(shù)據(jù)進(jìn)行判斷的:

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

  打開(kāi)這個(gè)文件夾一看:

1  眼前一亮,迫不及待地打開(kāi)safari.browser:

2  呵呵,原來(lái)真相躲在這里。稍微分析一下這個(gè)文件,就能知道:

  遨游3匹配的是第一項(xiàng)(也就是<browser id="Safari" parentID="Mozilla">部分),這項(xiàng)配置中沒(méi)有設(shè)置cookies=true。

  而正宗的Safari不僅匹配了第一項(xiàng),還匹配了第二項(xiàng),(也就是<browser id="Safari3to4" parentID="Safari">部分)這里設(shè)置了<capability name="cookies"  value="true" />。

  果然是遨游3“冒充”別人家的瀏覽器造成的,微軟沒(méi)想到會(huì)出現(xiàn)這樣的的UserAgent。

  找到真相,問(wèn)題就容易解決了。開(kāi)始以為只要在第一項(xiàng)中加<capability name="cookies" value="true" />就行了,但沒(méi)這么簡(jiǎn)單:

  1. safari.browser文件修改不能保存,提示說(shuō)是只讀文件。解決方法是:將safari.browser復(fù)制到其他地方,改好后,再?gòu)?fù)制回來(lái),覆蓋現(xiàn)有文件。

  2. 要以管理員身份運(yùn)行下面的命令將這些.browser文件編譯成程序集并安裝到GAC中:

  C:/Windows/Microsoft.NET/Framework/v4.0.30319/ASPNET_regbrowsers.exe –i

3  搞定!終于真相大白,不枉一場(chǎng)折騰。

  如果不寫這篇隨筆,可能加上cookieless="UseCookies"就完事,不會(huì)有接下來(lái)的深入研究。

  當(dāng)你有一個(gè)收獲,通過(guò)博客寫出來(lái)之后,不僅加深了這個(gè)收獲,很多時(shí)候你還會(huì)有意外的收獲...

NET技術(shù)ASP.NET4中不要相信Request.Browser.Cookies,F(xiàn)orm驗(yàn)證要用UseCookies,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 四虎com| 欧美在线观看www | 九九婷婷| 91精品国产自产在线观看 | 国产一二三区视频 | 亚洲国产午夜 | 91国内精品线免费播放 | 日韩久久精品 | 亚洲成a人一区二区三区 | 国内精品久久久久久不卡影院 | 91精品国产免费青青碰在线观看 | 中国嫩模一级毛片 | 微拍秒拍99福利精品小视频 | 国产精品欧美亚洲韩国日本不卡 | 99精品视频在线播放2 | 精品中文字幕在线 | 久久国产精品麻豆映画 | 好吊妞视频988在线播放 | 婷婷99精品国产97久久综合 | 欧美三级免费观看 | 欧美成人二区 | 国产一区二区三区手机在线观看 | 九一视频在线免费观看 | 国产高清一区二区三区视频 | 国产精品人成 | www.91麻豆| 日韩欧美伊人久久大香线蕉 | 97色婷婷成人综合在线观看 | 亚洲一区二区三区不卡视频 | 视频一区二区在线播放 | 激情图片激情小说 | 91白丝制服被啪到喷水在线 | 免费超爽大片黄 | 中国精品视频一区二区三区 | 国内精品免费视频自在线 | 婷婷激情丁香 | 亚洲免费午夜视频 | 久婷婷| 91福利在线观看视频 | 色妹子影院 | 亚洲艳图 |