使用会话状态是一种不安全的方式来在asp.net中创建用户登录和角色

考虑一个设置,其中id和密码列表存储在服务器上的数据库中,当用户输入他的登录凭据时,代码隐藏对服务器validation它并设置诸如Session [“id”] Session [“login”之类的值“]确定用户是否有权访问某个页面。

当用户尝试浏览页面时,页面会查看会话变量,然后根据需要重新定位用户并相应地调整其页面上的按钮。

这种设置有多安全。

asp.net的内置登录和角色function似乎过于严格,所以我试图探索其他选项。

使用Session的主要缺陷是它可能会将您的网站打开到Session Fixation漏洞。 当用户到达您的站点时建立会话,可能会发现会话ID(例如,通过MITM )。

此漏洞的示例步骤如下:

  1. 用户到达HTTP站点,ASP.NET为他们提供会话并将会话cookie发送给用户。
  2. 攻击者读取会话cookie值。
  3. 用户转到登录表单(HTTPS),登录并将您的idlogin值存储在会话中。
  4. 攻击者将其会话cookie设置为步骤2中的截获值。
  5. 攻击者现在有一个有效的登录会话,劫持现在登录的用户。

仅出于这个原因,我建议使用内置的登录和角色function,因为在建立经过身份validation的会话之前,不会设置auth cookie。 如果您坚持使用会话方法,我建议您在登录时调用Session.Abandon()以向用户授予新会话,以使其会话与之前未经身份validation的会话不同。

另请参阅我对这个问题的回答: https : //stackoverflow.com/a/18077422/413180

会话状态是一种跟踪用户登录的安全方式。 假设默认设置(在进程中,基于cookie的会话),它将与表单身份validation一样安全。 您获得的确切安全级别取决于您配置会话状态的方式。

  1. 无Cookie会话状态 – 这会打开一些潜在的安全漏洞(例如,用户共享包含会话ID的URL,用户获取包含具有会话ID的URL的屏幕截图等)

  2. 进程外会话状态 – 如果使用远程会话状态服务(或用于存储会话的数据库),则会话的安全性将取决于您是否正确锁定对会话状态服务或数据库的访问。

也就是说,使用Forms Auth获得的内置登录和角色function不是很难扩展和构建,而不是从头开始滚动。 如果您需要定制的东西,您也可以编写自己的会员和角色提供者 。 如果您需要根据用户名或角色锁定路由,这将非常有用,您可以在web.config中直接执行此操作。