【问题标题】:How to Generate a new Session ID如何生成新的会话 ID
【发布时间】:2012-08-12 19:51:01
【问题描述】:

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

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

【问题讨论】:

    标签: c# asp.net session sessionid


    【解决方案1】:

    您可以使用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's article]

    【讨论】:

    • 是的,使用上面的代码我每次都会得到新的 sessionId 但这会导致其他问题,即。即使我将上面的代码放入 if (!IsPostBack){} 中,它也会在每次页面加载时清除会话变量
    • @user1650891 你应该开始一个新问题
    • 这是我的问题的链接link
    • "此方法不打算从应用程序代码中调用。" msdn.microsoft.com/en-us/library/…
    • 我的SessionID 没有更新。 Context.Session.SessionID 显示相同的值。
    【解决方案2】:

    你可以使用

    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 的完整详细信息:Changing the session ID programmatically.

    【讨论】:

      【解决方案3】:

      是的,可以为会话生成新 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 : "); 
      } 
      

      【讨论】:

        【解决方案4】:

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

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

        很遗憾,没有一种支持的方式可以在没有往返的情况下执行此操作。您需要做的是在生成登录表单时擦除会话状态 cookie。当用户再次提交表单时,框架将调用SessionIDManager 来生成一个新表单。正确擦除会话 cookie 比大多数代码示例显示的要复杂一些。 cookie 名称是 web.config 中可配置的另一个参数。您需要通过访问属性从配置中读取它:

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

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

        【讨论】:

          【解决方案5】:

          我认为这与安全有关? Session.Clear()Session.Abandon() 会为您工作吗? This is a good SO link 与这些方法有关。

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

          【讨论】:

            猜你喜欢
            • 2015-04-03
            • 2018-07-31
            • 2011-12-29
            • 2011-08-19
            • 1970-01-01
            • 2017-03-27
            • 1970-01-01
            • 2012-07-21
            • 1970-01-01
            相关资源
            最近更新 更多