2013-03-06 131 views
0

我有asp.net web表单应用程序/而我需要做的是改变ASP.NET_SessionId当用户登录英寸后在会话变量变化的SessionID数据丢失

当用户登录我执行下面的代码:

SessionIDManager Manager = new SessionIDManager(); 
string NewID = Manager.CreateSessionID(Context); 
bool redirected = false; 
bool IsAdded = false; 
Manager.SaveSessionID(Context, NewID, out redirected, out IsAdded); 

因此,SessionId在此之后发生了变化。

但是,在此之后,如果我写一些会话变量,例如

Session["username"] = username; 

然后回发后我们的数据丢失或与旧的会话ID相关联。 我们有

Session["username"] == null 

请你能帮助我改变的SessionID,这样的数据也不会丢失后如何写入会话变量?

+0

您是否让客户知道您更改了其会话ID?认为需要设置一些cookie。 – CodeCaster 2013-03-06 07:35:29

+0

你有没有这样的想法? Response.Cookies [“ASP.NET_SessionId”]。Value = NewID;我做到了,但没有帮助。 – 2013-03-06 07:37:27

回答

0

命令“Manager.SaveSessionID”将删除旧的sessionid的所有数据。 只有一种方法来保存数据。这是手动移动数据。您使用以下功能登录按钮:

... 
using System.Web.SessionState; 
using System.Reflection; 

protected void ReGenerateSessionId() 
    { 
     SessionIDManager manager = new SessionIDManager(); 
     string oldId = manager.GetSessionID(Context); 
     string newId = manager.CreateSessionID(Context); 
     bool isAdd = false, isRedir = false; 
     manager.RemoveSessionID(Context); 
     manager.SaveSessionID(Context, newId, out isRedir, out isAdd); 

     HttpApplication ctx = (HttpApplication)HttpContext.Current.ApplicationInstance; 
     HttpModuleCollection mods = ctx.Modules; 
     System.Web.SessionState.SessionStateModule ssm = (SessionStateModule)mods.Get("Session"); 
     System.Reflection.FieldInfo[] fields = ssm.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
     SessionStateStoreProviderBase store = null; 
     System.Reflection.FieldInfo rqIdField = null, rqLockIdField = null, rqStateNotFoundField = null; 

     SessionStateStoreData rqItem = null; 
     foreach (System.Reflection.FieldInfo field in fields) 
     { 
      if (field.Name.Equals("_store")) store = (SessionStateStoreProviderBase)field.GetValue(ssm); 
      if (field.Name.Equals("_rqId")) rqIdField = field; 
      if (field.Name.Equals("_rqLockId")) rqLockIdField = field; 
      if (field.Name.Equals("_rqSessionStateNotFound")) rqStateNotFoundField = field; 

      if ((field.Name.Equals("_rqItem"))) 
      { 
       rqItem = (SessionStateStoreData)field.GetValue(ssm); 
      } 
     } 
     object lockId = rqLockIdField.GetValue(ssm); 

     if ((lockId != null) && (oldId != null)) 
     { 
      store.RemoveItem(Context, oldId, lockId, rqItem); 
     } 

     rqStateNotFoundField.SetValue(ssm, true); 
     rqIdField.SetValue(ssm, newId); 
    } 

protected void Login_Click(object sender, EventArgs e) 
{ 
    if (/*Login success*/) 
    { 
     ReGenerateSessionId(); // Change SessionID 
     Session["User"] = user; 
     Response.Redirect("Login_Success.aspx", true); 
    } 
}