新创建的会话不保留会话内容

时间:2011-08-03 11:27:13

标签: asp.net session-state session-variables

我正在使用的系统不使用标准的ASP.NET Auth / Membership工具来记录/退出用户。因此,在记录用户之后,我想向用户发出新的会话ID,以防止会话陷阱/劫持。我遇到的问题是,虽然我已经能够成功创建一个具有新ID的新会话,并将各种组件复制到新创建的会话,例如。会话[ “值”]。在下面的代码摘录的最后,新创建的会话是当前的HTTPContext会话,并具有被复制的会话值。但是,在执行Response.Redirect之后,新会话正在运行,但会话[“值”]中没有一个持续存在于两个请求中。正如您从下面的代码中看到的那样,我已经尝试将值添加到多个集合中以供使用。

任何帮助都会很棒!!提前致谢

    bool IsAdded = false;
    bool IsRedirect = false;

    HttpSessionState state = HttpContext.Current.Session;        
    SessionIDManager manager = new SessionIDManager();
    HttpStaticObjectsCollection staticObjects = SessionStateUtility.GetSessionStaticObjects(HttpContext.Current);
    SessionStateItemCollection items = new SessionStateItemCollection();

    foreach (string item in HttpContext.Current.Session.Contents)
    {
        var a = HttpContext.Current.Session.Contents[item];
        items[item] = a;
    }  

    HttpSessionStateContainer newSession = new HttpSessionStateContainer(
                                                    manager.CreateSessionID(HttpContext.Current),
                                                    items,
                                                    staticObjects,
                                                    state.Timeout,
                                                    true,
                                                    state.CookieMode,
                                                    state.Mode,
                                                    state.IsReadOnly);

    foreach (string item in HttpContext.Current.Session.Contents)
    {
        var a = HttpContext.Current.Session.Contents[item];
        newSession.Add(item,a);
    }



    SessionStateUtility.RemoveHttpSessionStateFromContext(HttpContext.Current);

    SessionStateUtility.AddHttpSessionStateToContext(HttpContext.Current, newSession);

    manager.RemoveSessionID(HttpContext.Current);
    manager.SaveSessionID(HttpContext.Current, newSession.SessionID, out IsRedirect, out IsAdded);

    return newSession.SessionID;

2 个答案:

答案 0 :(得分:0)

也许我在这里遗漏了一些东西,但这不会起作用:

Session["mysession"] = mySessionObject;

答案 1 :(得分:0)

基本上看起来它是不可能的,因为只有在到客户端进行一次往返以创建相应的会话cookie之后才能添加会话变量。因此,我必须创建新的新会话(使用新ID),以便在我添加会话变量时,客户端cookie具有相应的会话ID:烦人,因为实际上这是在用户之前发出新的会话ID认证

有趣的是,发布一个新的会话ID正是标准的asp.net身份验证/成员身份功能所做的但是能够维护会话变量,但是手动执行它并不会......这似乎有点奇怪。是否有一些方法可以解决这些问题,而不仅仅是开发人员......