2013-03-06 3 views
0

내가 가진 asp.net 웹 양식 응용 프로그램/그리고 내가해야 할 것은 ASP.NET_SessionId의를 변경할 때 사용자가 로그인 인치세션 변수의 변화 된 세션 데이터는

때 사용자가 로그인 I 실행에 다음 코드를 잃은 후 :

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

그래서 SessionId가 변경됩니다.

, 그때 이후 그 그럼 내가 다시 게시 후 우리의 데이터가 손실되거나 오래된 세션 ID와 관련된

Session["username"] = username; 

예를

에 대한 몇 가지 세션 변수를 작성하는 경우. 우리가

Session["username"] == null 

당신이 날 어떻게 데이터가 손실되지 않도록 세션 ID를 변경 한 후 세션 변수에 기록하는 데 도움이 될 수 있습니다하시기 바랍니다 있나요?

+0

클라이언트에 세션 ID 변경 사실을 알리시겠습니까? 설정된 쿠키가 필요하다고 생각하십시오. – CodeCaster

+0

당신은 이렇게 상상할 수 있니? Response.Cookies [ "ASP.NET_SessionId"]. 값 = 새 ID입니다. 나는 그것을했지만 도움이되지 못했습니다. –

답변

0

"Manager.SaveSessionID"명령은 이전 세션 ID의 모든 데이터를 제거합니다. 데이터를 보관할 수있는 방법은 하나뿐입니다. 수동 이동 데이터입니다. 아래 기능을 로그인 버튼에 사용하십시오 :

... 
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); 
    } 
} 
관련 문제