我正在使用的系统不使用标准的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;
答案 0 :(得分:0)
也许我在这里遗漏了一些东西,但这不会起作用:
Session["mysession"] = mySessionObject;
答案 1 :(得分:0)
基本上看起来它是不可能的,因为只有在到客户端进行一次往返以创建相应的会话cookie之后才能添加会话变量。因此,我必须创建新的新会话(使用新ID),以便在我添加会话变量时,客户端cookie具有相应的会话ID:烦人,因为实际上这是在用户之前发出新的会话ID认证
有趣的是,发布一个新的会话ID正是标准的asp.net身份验证/成员身份功能所做的但是能够维护会话变量,但是手动执行它并不会......这似乎有点奇怪。是否有一些方法可以解决这些问题,而不仅仅是开发人员......