Asp.net 更改后会话变量中的SessionID数据丢失
我有asp.net webforms应用程序,我需要做的是在用户登录时更改asp.net_会话ID 当用户登录时,我执行以下代码:Asp.net 更改后会话变量中的SessionID数据丢失,asp.net,session-variables,sessionid,Asp.net,Session Variables,Sessionid,我有asp.net webforms应用程序,我需要做的是在用户登录时更改asp.net_会话ID 当用户登录时,我执行以下代码: SessionIDManager Manager = new SessionIDManager(); string NewID = Manager.CreateSessionID(Context); bool redirected = false; bool IsAdded = false; Manager.SaveSessionID(Context, NewID,
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后写入会话变量,以便数据不会丢失?命令“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);
}
}
您是否让客户端知道您更改了其会话ID?我想需要做些饼干。你会遇到像这样的东西吗?Response.Cookies[“ASP.NET\u SessionId”]。Value=NewID;我做了,但没用。