【问题标题】:ASP.Net Cookieless: How to delete authentication cookieASP.Net Cookieless:如何删除身份验证 cookie
【发布时间】:2013-06-19 22:19:12
【问题描述】:

我们在 ASP.Net MVC3 站点中启用了无 cookie 身份验证和会话。我们遇到的问题是,如果您注销用户,它不会使存储在无 cookie 字符串中的已创建 cookie/会话无效。场景如下:

用户使用无cookie身份验证登录网站、注册和登录;用户现在在其 url 中有无 cookie 票证。用户通过创建桌面快捷方式或复制粘贴来复制 url。

用户退出站点,调用 FormAuthentication.SignOut() 使票证无效并重定向到登录页面。

用户现在可以简单地将该 URL 复制并粘贴到任何浏览器中,甚至可以转到另一台计算机,即使他们已经注销,该站点也会接受该身份验证票;造成严重的安全风险。

有没有办法禁用所有以前的 cookie,无论是否无 cookie?目前,我们的流程适用于基于 cookie 的会话/登录;我们只需要一个无 cookie 的解决方案。

到目前为止,我们找到的唯一可能的解决方案是跟踪数据库中的所有 cookie,并使数据库中的 cookie 无效,并检查 db 以确保当前 cookie 仍然有效。这会显着影响性能,因此我们希望在继续之前验证这是唯一/最佳的解决方案。

谢谢

【问题讨论】:

    标签: asp.net asp.net-mvc cookieless


    【解决方案1】:

    基本上在 url /F-long text/ 中存储了您的 FormAuthentication 票证。这张票在它自己的有效期内(至少如果它不是持久的),在那个时间跨度之后,url变得无效。所以我建议简单地减少时间跨度。如果显式注销是“必须具备的”,则只有在 webfarm 中并且没有某种横向扩展解决方案时才必须使用 db。如果你有一个盒子,你可以使用 HttpCache 来做脏活。此外,我会只使用用户 ID,而不是整个 cookie(即在登录时将具有一定时间跨度的用户 ID 添加到活动用户 ID 范围内,在 PostAuthorize 上的 Global.asax 检查用户是否在活动用户 ID 内,如果他在,则延长他的时间跨度并扔掉他否则,在注销时删除他)。

    【讨论】:

    • 非常感谢;很抱歉延迟回答。有点忙。我喜欢你的 HttpCache 解决方案;将它用于当前版本。我们将来会将它移动到网络农场,所以我们要么必须将它移动到数据库,要么使用我猜想跨越农场的分布式缓存。
    【解决方案2】:

    在 SignOut 后使用 Session.Abandon() 丢弃会话

    【讨论】:

    • 我已经尝试过那个解决方案;不幸的是,我们发现 URL 中编码的 cookie 如果稍后进入,即使您终止会话,它仍然可以使用。不过感谢您的回答。
    • 会话状态与 Forms 身份验证无关。
    猜你喜欢
    • 2016-05-30
    • 2012-02-08
    • 2010-12-11
    • 2011-08-19
    • 2016-03-28
    • 2017-04-28
    • 2017-03-30
    • 1970-01-01
    • 2018-05-10
    相关资源
    最近更新 更多