【问题标题】:Session ID not being stored in the cookie会话 ID 未存储在 cookie 中
【发布时间】:2012-04-20 21:58:45
【问题描述】:

在我的 ASP.NET MVC 3 应用程序中,当我在我的登录操作中选中我的记住我框时,它应该创建一个持久性 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 体验过。

【问题讨论】:

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


    【解决方案1】:

    这是预期的行为。设置授权 cookie 的概念和会话的概念不是一回事。只要用户打开浏览器,ASP.NET 中的会话就一直存在,因为会话存储在每个会话的 cookie 中。

    "...SessionID 值存储在非过期会话中 浏览器中的cookie。 (http://msdn.microsoft.com/en-us/library/ms178581.aspx)

    拥有一个持久会话是个坏主意。请记住,会话的正常情况是它们存储在内存中。您真的想将一周未登录的用户会话保存在内存中吗?您尝试保存的任何类型的“会话”数据都不应存储在会话中,而应存储在持久数据存储中(读取:数据库)。

    根据您的评论更新

    我可以建议你这样做吗:

    public string GetMyCompany(){
      return Session["MyCompany"] = Session["MyCompany"] ?? GetMyCompanyFromDatabase();
    }
    

    【讨论】:

    • 好吧,因为我想将用户的公司保存在会话变量中,因为它在我的_Layout.cshtml 文件中使用,并且认为会话变量是最好的,因为它在我的所有视图中都保持不变应用程序,但似乎如果他们关闭浏览器,这个变量就不再存在了
    • 当然,完全有道理。但是,我可以建议你这样做: public string GetMyCompany(){ return Session["MyCompany"] = Session["MyCompany"] ??GetMyCompanyFromDataBase(); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2013-08-01
    • 1970-01-01
    • 2014-11-05
    • 2020-08-28
    • 2023-03-25
    • 2014-12-30
    相关资源
    最近更新 更多