C#MVC应用程序 - 更改会话ID而不会丢失会话数据

时间:2013-08-01 23:17:38

标签: c# asp.net-mvc session

我正在尝试解决与MVC 4应用程序中的会话修复相关的问题(https://www.owasp.org/index.php/Session_fixation)。

当用户进入登录页面时,清除所有会话和会话相关的cookie。代码:

    Session.Clear();
    Session.Abandon();
    Session.RemoveAll();

    if (Request.Cookies["ASP.NET_SessionId"] != null)
    {
        Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
        Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-20);
    }

应用程序的登录页面会询问用户的凭据和验证码。当用户点击登录按钮时,我们发送一个ajax请求。代码:

    @using (Ajax.BeginForm("Autenticar", "Login", null, new AjaxOptions { OnComplete = "OnComplete", OnBegin = "OnBegin", OnSuccess = "OnSuccess", OnFailure = "OnFailure" }, new { @class = "Exception" }))
    {
        <fieldset>
            <legend>Login Form</legend>
            all form inputs
        </fieldset>
    }

此时我们需要更改Session.SessionID信息,以防止会话被修复。问题是在重新生成SessionID时会丢失在Session [“UserInfo”]中保存的所有用户信息。

我尝试创建新会话或更改当前会话ID,如本博文(http://weblogs.asp.net/anasghanem/archive/2008/12/16/programmatically-changing-the-session-id.aspx)中所建议的那样:

        SessionIDManager Manager = new SessionIDManager();

        string NewID = Manager.CreateSessionID(Context);
        string OldID = Context.Session.SessionID;
        bool redirected = false;
        bool IsAdded = false;
        Manager.SaveSessionID(Context, NewID,out redirected, out IsAdded);

任何人都可以处理一些有用的信息,以便将数据保存在新的SessionID中吗?

感谢。

1 个答案:

答案 0 :(得分:1)

答案是您应该在执行此操作之前将任何数据保存到数据库。对于无法从数据库重新生成的任何内容,您实际上不应该使用Session,因为IIS可以出于任何原因(或无理由)随时终止您的会话。 Session只是一种临时存储机制。