是否可以使用 ASP.NET 为会话生成新 ID?
我希望当有人在我设置初始会话变量之前登录我的网站时它会发生变化。
您可以使用 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 的文章]
你可以使用
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。
是的,可以为会话生成新的 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
都标记“此方法不打算从应用程序代码中调用”。HttpContext
的会话状态将保持与初始会话 ID 关联,因此您放入会话状态包中的任何内容都将丢失。由于一旦更改了 id,您就无法对会话执行任何操作,因此以这种方式更改 id 是没有意义的。不幸的是,没有一种受支持的方法可以在没有往返的情况下执行此操作。您需要做的是在生成登录表单时擦除会话状态 cookie。当用户提交回表单时,框架将调用
SessionIDManager
来生成一个新表单。正确擦除会话 cookie 比大多数代码示例显示的稍微复杂一些。 cookie 名称是 web.config 中可配置的另一个参数。您需要通过访问属性从配置中读取它:
((System.Web.Configuration.SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState")).CookieName
会话 id cookie 的范围不限于应用程序,因此如果同一服务器上安装了两个应用程序,通常希望它们使用不同的 cookie 名称,因此这种要求比您想象的更常见。
我认为这与安全有关?
Session.Clear()
或 Session.Abandon()
适合您吗? 这是一个很好的 SO 链接 与这些方法相关。
否则,这会很困难,因为 ASP.NET 会话 cookie 已经在用户的浏览器上。您可能不相信会话确实发生了变化。
对于那些现在正在搜索并看到所有这些反射黑客并正在努力解决会话固定问题的人。访问 asp.net 创建新会话 ID 的唯一方法是伪造一个为登录页面返回 null 的
SessionIDManager
。这样,asp.net 就认为浏览器从未发送过 cookie。
步骤如下:
CustomSessionIDManager
,注意YourLoginController/LoginMethod
:public class CustomSessionIDManager : ISessionIDManager
{
private readonly SessionIDManager _sessionIDManager;
public CustomSessionIDManager()
{
_sessionIDManager = new SessionIDManager();
}
public string CreateSessionID(HttpContext context)
{
return _sessionIDManager.CreateSessionID(context);
}
public string GetSessionID(HttpContext context)
{
var path = context.Request.Path.ToString();
if (path.EndsWith("YourLoginController/LoginMethod"))
return null;
return _sessionIDManager.GetSessionID(context);
}
public void Initialize()
{
_sessionIDManager.Initialize();
}
public bool InitializeRequest(HttpContext context, bool suppressAutoDetectRedirect, out bool supportSessionIDReissue)
{
return _sessionIDManager.InitializeRequest(context, suppressAutoDetectRedirect, out supportSessionIDReissue);
}
public void RemoveSessionID(HttpContext context)
{
_sessionIDManager.RemoveSessionID(context);
}
public void SaveSessionID(HttpContext context, string id, out bool redirected, out bool cookieAdded)
{
_sessionIDManager.SaveSessionID(context, id, out redirected, out cookieAdded);
}
public bool Validate(string id)
{
return _sessionIDManager.Validate(id);
}
}```
- Put it on the `web.config`:
<system.web>
<sessionState sessionIDManagerType="CustomSessionIDManager" />
</system.web>
Now it should return a new session for each login.