问题 如何在asp.net登录后更改会话ID


我有一个使用表单身份验证和成员资格的网站。用户必须启用cookie才能使用该站点。我被要求更改代码,以便在用户登录时更改会话ID。显然,这将防止会话修复攻击(http://en.wikipedia.org/wiki/Session_fixation)。有谁知道如何在不丢失整个会话的情况下更改会话ID? PHP有一个特定的方法来执行此操作,但我找不到.NET等价物。


6901
2017-09-14 01:35


起源



答案:


这是一篇博文 谈到这个:

ASP.NET不直接支持   重新生成会话的功能   ID。请参阅有关的文档   问题 这里。有一个 不那么   快速而肮脏的方式 做到这一点   设置 ASPNET_SessionID 价值   空字符串并重定向   该值被重新生成。


5
2017-09-14 03:02



我想想这个,但在重新生成之后,会话对象中的所有对象都会丢失...... - MemoryLeak
您链接到的博客文章已不再可用。 - Larry Silverman


答案:


这是一篇博文 谈到这个:

ASP.NET不直接支持   重新生成会话的功能   ID。请参阅有关的文档   问题 这里。有一个 不那么   快速而肮脏的方式 做到这一点   设置 ASPNET_SessionID 价值   空字符串并重定向   该值被重新生成。


5
2017-09-14 03:02



我想想这个,但在重新生成之后,会话对象中的所有对象都会丢失...... - MemoryLeak
您链接到的博客文章已不再可用。 - Larry Silverman


我在回答了类似的问题 在当前HTTPContext中生成新的ASP.NET会话。基本上我们必须更改一些SessionStateModule内部状态,以便能够重新生成会话ID而不会丢失Session中的对象。我使用反射将_rqId字段设置为新ID,将_rqSessionStateNotFound设置为true。缺点是我们必须向应用程序授予“完全信任”。


6
2017-12-12 02:29



该 接受了答案 引用了一篇针对.NET 1.1的文章(它实际上并没有解决会话固定问题,只涉及旧的会话ID重用),但是这个解决方案更优雅,并且在我们的.NET 4.5应用程序(一个MVC站点和一个Web窗体站点)中工作)。 - mlhDev


这是一个非常古老的问题,我正在复活,但这是解决方案:

var manager = new SessionIDManager();
bool redirected, isAdded;
manager.SaveSessionID(System.Web.HttpContext.Current, 
    "5vonjb4mtb1of2fxvhjvkh5d", out redirected, out isAdded);

// sessionId now equals "5vonjb4mtb1of2fxvhjvkh5d"
var sessionId = Session.SessionID;

1
2018-06-07 14:18



我知道,已经有一段时间了。但是我们尝试了你的代码并且它不适用于我们。 sessionId不等于“5vonjb4mtb1of2fxvhjvkh5d”。 - mosquito87
我这样做是成功的。 sessionid确实已更改为新的sessionid。 - pinopino
这让我们更接近但不够接近 - 仍在努力。这会更新会话ID并像您期望的那样发送cookie更新但我们仍然希望在同一请求期间使用会话。我们现在无法做到这一点 - 看来会话包是前一个;下一个请求会看到新的会话包但我们的值不存在。 - mlhDev