首页 新闻 会员 周边

关于session和FORM验证的诡异问题

0
悬赏园豆:10 [已解决问题] 解决于 2013-08-28 14:12

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数据却丢失。

卓酷的主页 卓酷 | 初学一级 | 园豆:65
提问于:2013-08-26 15:09
< >
分享
最佳答案
0

终于搞明白了,坑爹的session设置啊,asp.net居然不为ASP.NET_SessionId设置cookie过期时间,导致关闭浏览器就过期了,每次新开浏览器就会生成新的session,而原来的session还在慢慢等待过期,这种处理方式明显跟form验证的有效设置不一致,form验证设置了cookie的过期时间,在有效期内总是可以正常验证。

解决办法就是手动设置一次ASP.NET_SessionId这个cookie的有效期跟forms验证有效期一致即可。

卓酷 | 初学一级 |园豆:65 | 2013-08-26 17:18
其他回答(2)
0

Cookie 和 Session 有差别。

http://www.chinahtml.com/1007/128010707619425.html

收获园豆:10
Launcher | 园豆:45045 (高人七级) | 2013-08-26 15:17
0

来自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); 
        }
dudu | 园豆:31007 (高人七级) | 2013-08-26 22:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册