22

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

我希望在我设置初始会话变量之前有人登录我的网站时更改它。

4

5 回答 5

25

您可以使用SessionIdManager类执行此操作:

SessionIDManager manager = new SessionIDManager();

string newID = manager.CreateSessionID(Context);
bool redirected = false;
bool isAdded = false;
manager.SaveSessionID(Context, newID, out redirected, out isAdded);

[代码示例来自Anas Ghanem 的文章]

于 2012-08-16T13:00:19.070 回答
5

您可以使用

SessionIDManager.CreateSessionID Method :返回一个唯一的会话标识符,它是一个随机生成的数字,编码为 24 个字符的字符串。

代码

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

在这里您可以找到有关 hsi 的完整详细信息:以编程方式更改会话 ID。

于 2012-08-16T12:59:12.567 回答
4

是的,可以为会话生成新 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 : "); 
} 
于 2012-08-16T13:06:35.217 回答
3

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

  • 两者CreateSessionID标记为SaveSessionID“此方法不打算从应用程序代码中调用”。
  • SessionID 提供者是一种可插入类型(参见例如实现自定义 SessionIDManager),因此至少您需要实例化正确的类型。
  • 附加到 的会话状态HttpContext将保持与初始会话 ID 相关联,因此您放入会话状态包中的任何内容都将丢失。因为一旦你改变了你的 id,你就无法对会话做任何事情,所以以这种方式改变你的 id 是没有意义的。

不幸的是,没有往返的支持方式来做到这一点。您需要做的是在生成登录表单时擦除会话状态 cookie。当用户提交表单返回时,框架将调用SessionIDManager生成一个新表单。正确擦除会话 cookie 比大多数代码示例显示的要复杂一些。cookie 名称是 web.config 中可配置的另一个参数。您需要通过访问属性从配置中读取它:

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

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

于 2017-07-28T23:22:57.610 回答
2

我认为这与安全有关?a Session.Clear()orSession.Abandon()对你有用吗? 这是与这些方法相关的一个很好的 SO 链接。

否则,这很困难,因为 ASP.NET 会话 cookie 已经在用户的浏览器上。您可能不相信会话确实发生了变化。

于 2012-08-16T13:00:46.607 回答