【问题标题】:Storing session data in asp .net mvc在 asp .net mvc 中存储会话数据
【发布时间】:2014-11-03 13:22:34
【问题描述】:

我在我的应用程序中使用Session 来存储一些数据,例如用户名(写你好,...)等等。另外,我使用FormsAuthentication 来验证用户,所以控制器有这样的代码:

protected void SetAuthCookie(int userId)
    {
        FormsAuthentication.SetAuthCookie(userId.ToString(), true);
        User user = Repositories.UserRepository.GetUserById(userId);

        Session["name"] = user.Name;
        Session["email"] = user.Email;
        Session["balance"] = user.TotalBalance + " / " + user.ActiveBalance;
        Session["isConfirmed"] = user.IsConfirmed;
        Session["phone"] = user.Phone;
    }

所以,当我在一些代码更改后重新启动应用程序时,会话数据被破坏,但用户仍然经过身份验证,所以我的情况非常糟糕,我想修复它。一方面,我可以在某处创建代码,检查会话数据是否正常,否则刷新。另一方面,我可能会错过一些以正确方式存储这些数据的技术吗?

在这种情况下最好的解决方案是什么?


<sessionState mode="InProc" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
  </providers>
</sessionState>

【问题讨论】:

  • cookies 在会话中持续存在。这里有什么问题?当您检测到 cookie 时,设置会话值。
  • 另外,不建议在 MVC 中使用会话。 MVC 旨在尽可能地无状态,而依赖会话会破坏这一点。
  • 有时,用户已通过身份验证,但会话数据不再存在。发生这种情况,当我在代码更改后重新启动应用程序时,我担心在其他情况下会出现这种情况
  • 如果会话是inProc,它会在您回收应用程序池时被销毁,当您更新 web.config 或重建(部署新程序集)时会发生这种情况。
  • 问题出在代码中,而不是身份验证的工作方式。不要试图“修复”没有损坏的东西。您的代码假定只有未经身份验证的用户才会访问您的网站,这显然是错误的。如果你发现它是空的,你可以检查 Session 对象并重新填充它。

标签: c# asp.net asp.net-mvc session


【解决方案1】:

我在 global.asax.cs 文件中遇到了类似的问题:如果会话为空并且请求已通过身份验证,它将强制注销。 (取一个总是应该设置为检查 null 的会话值)

    protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        ForceLogoutIfSessionExpired();
    }

    private void ForceLogoutIfSessionExpired()
    {
        if (Context.Handler is IRequiresSessionState)
        {
            if (Request.IsAuthenticated)
            {
                if (HttpContext.Current.Session["name"] == null)
                {
                    AuthenticationHandler.SignOut(Response);
                    Response.Redirect(FormsAuthentication.LoginUrl, true);
                }
            }
        }

【讨论】:

  • 感谢您对 Application_PreRequestHandlerExecute 的想法,我认为这正是我所需要的。但是如果是空的我宁愿重新填充会话数据,而不是注销用户,这也是正常的计划,不是吗?
猜你喜欢
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多