会话ID未被存储在cookie中
问题描述:
在我的ASP.NET MVC 3应用程序中,当我在LogOn Action中检查我的记住我框时,它应该创建一个持久性cookie,以便当我关闭浏览器并重新打开会话ID未被存储在cookie中
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
当我使用小提琴手,我可以看到会话ID被送到像这样:它,我应该还是会保持登录
Request sent 342 bytes of Cookie data:
ASP.NET_SessionId=<Session ID>; .ASPXAUTH=<Auth String>
但是,当我关闭浏览器,重新打开它,我仍然登录,但请求不发送会话ID:
Request sent 298 bytes of Cookie data:
.ASPXAUTH=<Auth String>
然后我把Response.Write(Session.SessionID)
放在我的Action中,每当我重新打开我的浏览器时刷新页面,这个就会改变。如果我不关闭浏览器,则每次刷新时会话ID保持不变。
我使用StateServer
来保持会话状态,因为我认为这可能会解决问题,因为我也通过InProc
来体验它。
答
这是预期的行为。设置授权cookie的概念和会话的概念并不是一回事。只要用户打开浏览器,ASP.NET中的会话就会生存,因为会话存储在每个会话cookie中。
” ...... SessionID的值存储在浏览器中的永久的session cookie的 (http://msdn.microsoft.com/en-us/library/ms178581.aspx)
持续存在会话是一个糟糕的主意,请记住,Sessions的正常情况是它们存储在内存中,您是否真的想将用户会话保存在未登录的内存中在一个星期内?您试图保存那么长时间的任何类型的“会话”数据都不应该存储在会话中,而是存储在持久数据存储区中(读取:数据库)
根据您的意见更新
我可能会建议你做这样的事情:
public string GetMyCompany(){
return Session["MyCompany"] = Session["MyCompany"] ?? GetMyCompanyFromDatabase();
}
右行,因为我想在一个会话变量保存用户的公司,因为它是在用我的'_Layout.cshtml'文件和思想的Session变量会是最好的,因为它在我的应用程序中的所有视图中都是持久的,但似乎如果他们关闭浏览器,这个变量不再存在 – CallumVass 2012-04-20 13:52:49
当然,非常有意义。但是,我建议你做这样的事情: public string GetMyCompany(){ return Session [“MyCompany”] = Session [“MyCompany”] ?? GetMyCompanyFromDataBase(); } – aquinas 2012-04-20 13:56:56
啊,完美我会试试看,谢谢! – CallumVass 2012-04-20 13:58:28