在我的ASP.NET MVC 3应用程序中,当我在LogOn Action中检查我的记忆框时,它应该创建一个持久性cookie,这样当我关闭浏览器并重新打开它时,我仍然应该登录:
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
当我使用Fiddler时,我可以看到会话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)
放入我的操作中,每次重新打开浏览器后,每次刷新页面时都会更改。如果我不关闭浏览器,那么每次刷新时会话ID都保持不变。
我正在使用StateServer
来保存会话状态,因为我认为这可以解决问题,因为我也经历了InProc
。
答案 0 :(得分:3)
这是预期的行为。设置授权cookie的概念和会话的概念不是一回事。只要用户打开浏览器,ASP.NET中的会话就会存在,因为会话存储在每个会话的cookie中。
“... SessionID值存储在非过期会话中 浏览器中的cookie。 (http://msdn.microsoft.com/en-us/library/ms178581.aspx)
拥有持久性会话是一个坏主意。请记住,Sessions的正常情况是它们存储在内存中。你真的想要在一周内没有登录的内存中保存用户会话吗?您尝试保存的任何类型的“会话”数据都不应存储在会话中,而应存储在持久数据存储中(读取:数据库)。
根据您的评论更新
我建议你做这样的事情:
public string GetMyCompany(){
return Session["MyCompany"] = Session["MyCompany"] ?? GetMyCompanyFromDatabase();
}