2013-03-06 65 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); 
    } 
}