C#MVC应用程序-在不丢失会话数据的情况下更改会话ID

C#MVC应用程序-在不丢失会话数据的情况下更改会话ID,c#,asp.net-mvc,session,C#,Asp.net Mvc,Session,我试图解决一个与MVC4应用程序中的会话固定相关的问题() 当用户进入登录页面时,清除所有会话和会话相关cookie。代码: Session.Clear(); Session.Abandon(); Session.RemoveAll(); if (Request.Cookies["ASP.NET_SessionId"] != null) { Response.Cookies["ASP.NET_SessionId"].Value = str

我试图解决一个与MVC4应用程序中的会话固定相关的问题()

当用户进入登录页面时,清除所有会话和会话相关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>
    }
有人能给我一些有用的信息来保存新SessionID中的数据吗


谢谢。

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

如果您真的想继续连接
会话
,您无能为力,但是如果您使用基于
缓存
层的缓存,例如Memcached,您可以轻松地更改很多内容并保留所有值感谢@balexandre的快速响应。我在搜索Memcached,因为我以前从未听说过它。我得到了这个:这个:这是我应该寻找的吗?使用此解决方案是否存在任何问题、风险或困难?再次感谢。
        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);