8

我正在尝试在一个相当大的 ASP.NET Web 应用程序 (C#) 上解决一些安全问题。为了防止会话固定攻击,我想在每次用户验证自己时生成一个新的会话 ID。但是我只想生成一个新的会话 ID 而不会丢失会话的其余部分。在对这个主题进行了一些研究之后,我发现了一些可行的解决方案:

解决方案 1:在 ASP.NET 中生成新的 SessionId
这建议通过将会话 cookie 设置为空字符串来手动清除它。然而,这需要刷新页面或使用 AJAX 来确保 cookie 确实会被删除,这在我的具体情况下并不是一个真正可行的选择。

解决方案 2:在当前 HTTPContext 中生成一个新的 ASP.NET 会话
我已经实现了这种方法,并且它按预期工作。但是,正如原始海报所述,这并不是您所说的优雅解决方案。此外,这篇文章已有几年历史了,我希望现在可能有更好的解决方案。

我想知道的是,在我的研究中是否有任何替代方法可以做到这一点,或者是否可以在不操纵会话管理内部的情况下使用解决方案 2 之类的方法。

4

2 回答 2

4

由于会话管理在 ASP.NET 中的设计是如何工作的,因此实现您想要的并不是那么容易,重新解决方案编号 2。考虑到 ASP.NET 会话状态实现细节在某些时候发生变化,解决方案 (2) 似乎有点冒险。

我推荐解决方案 1 的变体,当用户进行身份验证时,您将会话中的相关数据存储到 db/cache,为用户获取一个新会话,然后使用您需要的数据填充该会话。由于数据正在从“未经身份验证”会话移动到“经过身份验证”会话,因此您还应该注意验证该数据。

手动清除会话 cookie 可能是一个滑坡,重新提升 ASP.NET 会话安全性您将在NWebsec.SessionSecurity的经过身份验证的会话标识符中找到更强大的解决方案(免责声明:我是该项目的开发人员)。

于 2013-07-17T14:35:28.127 回答
0

Web.Config 更改 sessionState cookieName="ABC"

在块中的 Login.aspx 页面中!ispostback 写入

Response.Cookies.Add(new HttpCookie("ABC", ""));

享受

- 节省时间是好事!

于 2016-05-20T06:22:53.283 回答