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

Posted

技术标签:

【中文标题】登录asp.net后如何更改会话ID【英文标题】:how to change session id after login in asp.net 【发布时间】:2010-11-28 00:10:42 【问题描述】:

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

【问题讨论】:

【参考方案1】:

Here's a blog post 谈到这个:

ASP.NET 不直接支持 重新生成会话的功能 ID。请参阅有关的文档 问题here。有一个not-so quick and dirty way 可以通过 将ASPNET_SessionID 值设置为 空字符串和重定向所以 该值已重新生成。

【讨论】:

我也想过这个,但是重新生成之后,会话对象中的所有对象都会丢失...... 您链接到的博文不再可用。【参考方案2】:

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

【讨论】:

accepted answer 引用了一篇针对 .NET 1.1 的文章(它实际上并没有解决会话固定问题,只是旧会话 ID 重用),但是这个解决方案更优雅,并且在我们的 . NET 4.5 应用程序(一个 MVC 站点和一个 Web 窗体站点)。【参考方案3】:

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

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;

【讨论】:

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

以上是关于登录asp.net后如何更改会话ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在asp.net中恢复会话

如何使用httpcontext在asp.net中显示会话过期的消息

ASP.NET MVC 中的登录会话

如何使 ASP.NET MVC 登录用户超时?

ASP.Net Core - 登录后如何等待用户身份立即可用?

在 ASP.NET 中注销时如何杀死用户的会话