如果ASP.NET Web应用程序中使用Form验证并使用cookie保存用户的登录状态,一般做法是设置如下

<authentication mode="Forms" >
<forms loginUrl="~/Home/LogIn" timeout="2880" cookieless="UseCookies" />
</authentication>

如果不这样设置的话,cookieless会使用默认值UseDeviceProfile。用了UseDeviceProfile,,ASP.NET会根据Request.Browser.Cookies来判断当前浏览器是否支持Cookie,而这个值ASP.NET是根据C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Browsers的文件夹中的配置进行判断的,也就是说微软是将各大流行常见的浏览器是否支持Cookie做了一个默认值,这样做如果判断浏览器类型错误悲剧就发生了,某些不知名的浏览器的用户很可能无法登录网站。更极端的情况如果用户手动禁用了浏览器Cookie,也将无法正常登录。

我这里想讨论的是无论在各种情况下,做为一个网站开发人员应该为用户提供一个良好的交互,提示有价值的错误信息。我做了一个小测试,就是在火狐3.6上禁用所有cookie后,浏览和登录几个知名的网站:

  • 首先访问google,"此页面重定向不正确 Firefox 检测到该服务器正在将此地址的请求循环重定向。 * 此问题可能是因为禁用或拒绝 Cookie 导致。
  • 百度能够正常访问,但是输入用户名和密码后,还是无法登录,没有任何提示。
  • 访问微软官网,一切正常,但是点击登录页面后发生跳转到https://login.live.com/cookiesDisabled.srf?mkt=EN-US&lc=1033。并在页面提示“Cookies  must be allowed”

经过这几个测试后,google其实技术上已经检测出禁用Cookie的原因,但是却给出一个页面载入错误。百度好像没有意识到,会使用户疑惑,怎么就不能登录了???最后 还是比较佩服微软的细致,用户体验比较友好。

之后细想了一下这个原理,个人认为是当后台需要向客户端生成Cookie时,又不知道用户是否禁用了Cookie,方法其实就是先检测Cookies["IsCookieSupported"]是否为null。若为空,可能是第一次访问网站,马上生成Cookies["IsCookieSupported“],并跳转到检测页面,具体实现看

下面的示例源代码,使用ASP.NET MVC

       public ActionResult TestCookies(string returnUrl)
        {
            if (HttpContext.Request.Cookies["IsCookieSupported"] == null)
            {
                return Redirect("/Home/FailedCookies");
            }
            else
                return Redirect(returnUrl);
        }
        public ActionResult FailedCookies()
        {
            return Content("No Cookies suported ,I am sorry that you can not login !");
        }
        public ActionResult LogIn()
        {
            if (!Request.Browser.Cookies)
                return Content("No Cookies suported ,I am sorry that you can not login !");
            if (HttpContext.Request.Cookies["IsCookieSupported"] == null)
            {
                HttpCookie hc = new HttpCookie("IsCookieSupported", "test");
                HttpContext.Response.Cookies.Add(hc);
                return Redirect("/Home/TestCookies?returnUrl='/Home/Login'");
            }
       }
 

      后来我启用了Cookie后,登录window live,查看Cookie信息时发现了名为CkTst(CookiesTest)的Cookie,也验证了我的想法.

posted on 2011-03-17 21:18  LinkSea  阅读(1314)  评论(0)    收藏  举报