win7上测试站点,session设置为InProc,30分钟过期,form验证设置为30分钟过期,二者都是cookieless="UseCookies",诡异的问题出现了,当一个IE窗口被打开,并成功登陆后,如果关闭再新开一个IE打开主页面,则form验证的用户信息存在,但session却都消失了,谁知道这是怎么回事?如何解决?
利用客户端cookies来保存服务端的SessionID是ASP.NET常用的技术,但是默认情况下,ASP.NET却把该cookie设置成了浏览器进程级别的生命周期,如果浏览器关闭该cookie将丢失。也许这是为了安全的考虑吧,但是如果用户总是不小心关闭浏览器的话,他将一遍一遍不停的登陆,而且更坑爹的是,from验证的cookie标示却被ASP.NET设计为可存活一段指定的时间,如果用forms验证搭配session存储个性数据的话,浏览器被关闭重开后将导致用户在线但个性化session数据却丢失。
终于搞明白了,坑爹的session设置啊,asp.net居然不为ASP.NET_SessionId设置cookie过期时间,导致关闭浏览器就过期了,每次新开浏览器就会生成新的session,而原来的session还在慢慢等待过期,这种处理方式明显跟form验证的有效设置不一致,form验证设置了cookie的过期时间,在有效期内总是可以正常验证。
解决办法就是手动设置一次ASP.NET_SessionId这个cookie的有效期跟forms验证有效期一致即可。
来自Persisting Session Between Different Browser Instances的解决方法:
protected void Application_PostMapRequestHandler(object sender, EventArgs e) { if (Request.Cookies["ASP.NET_SessionIdTemp"] != null) { if (Request.Cookies["ASP.NET_SessionId"] == null) Request.Cookies.Add(new HttpCookie("ASP.NET_SessionId", Request.Cookies["ASP.NET_SessionIdTemp"].Value)); else Request.Cookies["ASP.NET_SessionId"].Value = Request.Cookies["ASP.NET_SessionIdTemp"].Value; } } protected void Application_PostRequestHandlerExecute(object sender, EventArgs e) { HttpCookie cookie = new HttpCookie("ASP.NET_SessionIdTemp", Session.SessionID); cookie.Expires = DateTime.Now.AddMinutes(Session.Timeout); Response.Cookies.Add(cookie); }