如果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,也验证了我的想法.
浙公网安备 33010602011771号