会话ID未存储在cookie中

时间:2012-04-20 13:25:45

标签: c# asp.net-mvc-3 forms-authentication

在我的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

1 个答案:

答案 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();
}