Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何生成新的会话ID_C#_Asp.net_Session_Sessionid - Fatal编程技术网

C# 如何生成新的会话ID

C# 如何生成新的会话ID,c#,asp.net,session,sessionid,C#,Asp.net,Session,Sessionid,是否可以使用ASP.NET为会话生成新ID? 我希望在我设置初始会话变量之前,当某人登录到我的网站时,它会发生变化。您可以使用 返回唯一的会话标识符,该标识符是编码为24个字符字符串的随机生成的数字 代码 在这里您可以找到有关hsi的完整详细信息:您可以使用类: [代码示例来自我假设这是与安全相关的?与这些方法相关的会话.Clear()或会话.放弃()是否对您有效 否则,这将很困难,因为ASP.NET会话cookie已在用户的浏览器上。您可能不相信会话已真正更改。是的,可以为会话生成新ID。 下

是否可以使用ASP.NET为会话生成新ID?

我希望在我设置初始会话变量之前,当某人登录到我的网站时,它会发生变化。

您可以使用

返回唯一的会话标识符,该标识符是编码为24个字符字符串的随机生成的数字

代码

在这里您可以找到有关hsi的完整详细信息:

您可以使用类:


[代码示例来自我假设这是与安全相关的?与这些方法相关的会话.Clear()会话.放弃()是否对您有效


否则,这将很困难,因为ASP.NET会话cookie已在用户的浏览器上。您可能不相信会话已真正更改。

是的,可以为会话生成新ID。 下面是一个例子

SessionState.SessionIDManager Manager = new SessionState.SessionIDManager(); 
string NewID = Manager.CreateSessionID(Context); 
string OldID = Context.Session.SessionID; 

bool IsAdded = false; 
Manager.SaveSessionID(Context, NewID, false, IsAdded); 

Response.Write("Old SessionId Is : " + OldID); 
if (IsAdded) { 
    Response.Write("<br/> New Session ID Is : " + NewID); 
} 
else { 
    Response.Write("<br/> Session Id did not saved : "); 
} 

ASP.Net会话管理基础结构不公开在处理请求期间更改会话id的受支持方法。如果编写受支持的代码对您很重要,则在接受的答案中有几点需要注意


  • CreateSessionID
    SaveSessionID
    都是“不打算从应用程序代码调用此方法”
  • SessionID提供程序是一种可插入类型(请参见示例),因此至少需要实例化正确的类型
  • 附加到
    HttpContext
    的会话状态将与初始会话id保持关联,因此您放在会话状态包中的任何内容都将丢失。因为一旦您更改了id,您就无法对会话执行任何操作,因此以这种方式更改id是毫无意义的
不幸的是,没有一种不需要往返的支持方法来实现这一点。您需要做的是在生成登录表单时擦除会话状态cookie。当用户重新提交表单时,框架将调用
SessionIDManager
来生成一个新表单。正确擦除会话cookie比比大多数代码示例显示的更简单。cookie名称是web.config中可配置的另一个参数。您需要通过访问以下属性从配置中读取它:

((System.Web.Configuration.SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState")).CookieName

会话id cookie的作用域不限于应用程序,因此,如果在同一台服务器上安装了两个应用程序,则通常希望它们使用不同的cookie名称,因此这比您想象的更为常见。

是的,使用上述代码,我每次都会获得新的会话id,但这会导致其他问题,即清除会话变量如果(!IsPostBack){}@user1650891您应该开始一个新问题,则每次加载页面时都可以启动。这是指向我的问题“此方法不打算从应用程序代码调用”的链接。我的
SessionID
没有更新。
Context.Session.SessionID
显示相同的值。
SessionState.SessionIDManager Manager = new SessionState.SessionIDManager(); 
string NewID = Manager.CreateSessionID(Context); 
string OldID = Context.Session.SessionID; 

bool IsAdded = false; 
Manager.SaveSessionID(Context, NewID, false, IsAdded); 

Response.Write("Old SessionId Is : " + OldID); 
if (IsAdded) { 
    Response.Write("<br/> New Session ID Is : " + NewID); 
} 
else { 
    Response.Write("<br/> Session Id did not saved : "); 
} 
((System.Web.Configuration.SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState")).CookieName