Str*_*ill 7 .net c# asp.net session
因此,在登录/更改访问级别/等之后,我遇到了一个实现会话ID滚动的有趣问题.
在登录时我正在尝试使用SessionIDManager生成新的会话ID,但是这只会更改cookie标头,它不会在HttpContext中交换会话,因此我会向会话添加其他详细信息(各种详细信息)将用户绑定到会话ID),他们立即迷路(更不用说旧会话被遗弃).
为了防止会话劫持(通过存储主要的非SSL通信)和会话固定,我们应该在登录时生成新的会话ID,但Microsoft似乎不允许您这样做(grr,这么多的只读变量和没有构造函数的密封类).我可以只迁移后端SQL中的所有数据,但这似乎有点"肮脏的黑客".
关于如何正确地做到这一点的任何想法?
编辑:
我发现的实现:
Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
Run Code Online (Sandbox Code Playgroud)
会话仍然是旧会话,因此在下一页上,所有更改都将丢失.
SessionIDManager在SaveSessionID之后不返回会话对象,因此我无法向刚创建的会话添加详细信息.在下一页加载我可以,但旧会话现在无法访问(并放弃,但即使它没有被放弃...).
HttpContext.Session是只读的,即使它不是,HttpSessionState也没有构造函数.
编辑2:
显然会话固定和劫持在此之前已经被讨论过了,答案是"微软似乎并不关心",实施的两阶段修复效果不佳.
好吧,所以这是一个问题,展示了如何使用这种方法劫持基于会话的身份验证和基于表单的身份验证(您需要一个有效的用户帐户,但您可以劫持其他人的会话),网上有一些博客抱怨会话固定和轻松利用劫持的能力。显然这是一个大问题。Yahia指出微软对解决这个问题不感兴趣。
我所做的是创建一个与会话 ID 配对的真实性密钥,登录后我们将生成一个新密钥并将其放入会话中,并为用户提供一个 cookie,如果会话中有密钥,则它们必须匹配,否则我们会踢用户(劫持尝试)。这似乎是在提到的博客上执行此操作的常见方法(另一种方法是使用表单身份验证来基本上加密 cookie,虽然这工作正常,但我希望该解决方案能够与多种类型的身份验证兼容)。
建议的一件事可能会有所帮助,那就是通过使用另一个应用程序作为仅提供 302 重定向的非 ssl 前端来防止任何非 ssl 通信,正如Yahia所建议的那样,同时这通过防止会话泄露而有很大帮助首先,ID 需要对应用程序的部署方式进行大量重组才能修复,而且 IMO:.NET 的不确定会话管理应该首先得到修复,我希望我们的应用程序能够从根本上得到充分的保护不依赖其他应用程序进行 302 重定向,因此任何信息泄漏都是无关紧要的,因为 cookie 将在登录时轮换。
| 归档时间: |
|
| 查看次数: |
3992 次 |
| 最近记录: |