C# 会话在更改其ID时丢失键和值

C# 会话在更改其ID时丢失键和值,c#,asp.net,session-cookies,C#,Asp.net,Session Cookies,我正在更改会话ID,但当它重定向到Default.aspx页面时,它会丢失我分配给它的所有密钥 这很奇怪,有什么线索或帮助吗 即使我在评论这一部分: 它失去了一切 这是我的密码: protected void btnDebugLogin_Click(object sender, EventArgs e) { try { string email = "test@123.com";

我正在更改会话ID,但当它重定向到Default.aspx页面时,它会丢失我分配给它的所有密钥

这很奇怪,有什么线索或帮助吗

即使我在评论这一部分:

它失去了一切

这是我的密码:

protected void btnDebugLogin_Click(object sender, EventArgs e)
        {
            try
            {
                string email = "test@123.com";
                string pw = "password";
                string ip = Request.UserHostAddress.ToString();
                string browseragent = Request.UserAgent.ToString();
                ConsoleUser loginUser = new ConsoleUser();               

                AbandonSession();//Delete any existing sessions
                var newSessionId = CreateSessionId(HttpContext.Current); //Create a new SessionId
                SetSessionId(HttpContext.Current, newSessionId);

                loginUser = SecureLogin.Login(email, pw, ip, browseragent, referrer, LangCode, Session.SessionID.ToString(), null);

                if (loginUser == null)
                {
                    lblMsg.Visible = true;
                }
                else
                {
                    Session["CurrentUser"] = loginUser;
                    Session["CurrentLoginID"] = loginUser.CurrentLoginId; // Used for tracking User Activity in KeepSessionAlive
                    Response.Redirect("/qConsole/Default.aspx",false);
                }
            }
            catch(Exception ex)
            {

            }
        }


 protected void AbandonSession()
        {
            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);
            }
            if (Request.Cookies["__AntiXsrfToken"] != null)
            {
                Response.Cookies["__AntiXsrfToken"].Value = string.Empty;
                Response.Cookies["__AntiXsrfToken"].Expires = DateTime.Now.AddMonths(-20);
            }
        }

        private static string CreateSessionId(HttpContext httpContext)
        {
            var manager = new SessionIDManager();

            string newSessionId = manager.CreateSessionID(httpContext);

            return newSessionId;
        }

        public static void SetSessionId(HttpContext httpContext, string newSessionId)
        {
            var manager = new SessionIDManager();

            bool redirected;
            bool cookieAdded;

            manager.SaveSessionID(httpContext, newSessionId, out redirected, out cookieAdded);

        }
在加载Default.apsx页面之前,验证部分在母版页中完成,如下所示:

 protected void Page_Init(object sender, EventArgs e)
        {
            if (Session["CurrentUser"] == null)
            {
                Response.Redirect("/");
            }

// ..

        }

这是告诉客户端使用新会话id的预期结果。这些值仍在旧会话中,但旧会话和新会话之间没有连接。会话在请求周期的早期附加到请求,在处理过程中更改cookie值不会影响附加到用户请求的会话,直到下一个请求到来。您要做的是在首次呈现页面时清除cookie,而不是在他们单击按钮时。我在回答中提到了会话管理的其他一些微妙之处


您已将此问题标记为csrf,但您的解决方案对该攻击无效。重置会话id所防止的是会话固定。

这听起来确实像它应该如何工作。会话变量存储在key=SessionID的字典中。您只能使用原始ID检索它们,但在使用SessiondManager更改ID后,我将CurrenUser和CurrentLoginID对象分配给会话!不是吗?在同一个请求中删除旧会话和创建新会话都会遇到问题--ASP.NET将发出两个同名的cookie头,一个过期,另一个具有新ID。不确定这将如何进行。你就不能吗?我只是想在登录后更改ID,这可能与我实现的方式不同吗?你为什么还要更改会话ID?我只是想在登录后更改ID,这可能与我实现的方式不同吗?是的,但是,当您更改ID时,您将丢失所有以前的状态,包括他们已登录。如果你想使用ASP.Net会话框架,你需要在他们登录的请求之前更改id。您可以在发送登录页面时执行此操作,只需确保不会在会话中放置任何内容。
 protected void Page_Init(object sender, EventArgs e)
        {
            if (Session["CurrentUser"] == null)
            {
                Response.Redirect("/");
            }

// ..

        }