当非空用户名不同时,Asp.Net MVC Antiforgery验证失败......这是合理的吗?

时间:2015-02-11 20:52:52

标签: asp.net-mvc security cookies csrf antiforgerytoken

我的问题是关于MVC Antiforgery系统(描述here)。

考虑一个简单的应用程序,它将待办事项发布到/ Todo / Create。相应的操作方法具有ValidateAntiForgeryToken属性。请考虑以下客户端工作流程:

  1. 用户A登录并转到该页面以创建待办事项,但尚未执行此操作。
  2. 用户B(物理上位于同一台计算机上)在同一浏览器中打开一个新标签,退出用户A的帐户,以用户B登录。然后浏览器获取用户B的验证cookie
  3. 一段时间后,用户A切换回原始标签,点击“创建”按钮。在他们正在制作的待办事项上。
  4. 在这种情况下,Antiforgery验证将不会通过,因为表单令牌适用于用户A,而验证cookie适用于用户B.

    我确定此行为存在有效的安全原因(例如,另一个设法以恶意用户身份登录的网站上的脚本,以便将“&#t; todo”数据发布到其帐户中) ,但它有时不会阻止我的合法用户发生上述情况。

    我的问题是:

    • 是否有最佳做法'处理这种情况的方法?它通常只是显示自定义错误,告诉他们重新加载页面和/或再次登录等情况?
    • 有没有办法知道开箱即用的MVC Antiforgery系统何时遇到此错误?它似乎只抛出相同类型的异常(HttpAntiForgeryException)。我是否需要恢复使用/修改其来源?

1 个答案:

答案 0 :(得分:1)

我看到两种处理方式:

  1. 在点击按钮之前使用Javascript回调到服务器以检测用户是否仍然登录。如果没有 - 向他显示消息。这样做应该相对容易。但它需要一个额外的呼叫,而且需要更多的时间来执行您的请求。
  2. 避免回调的一个解决方案可能是使用html 5 localStorage(例如,您可以使用modernizr在其他浏览器上支持)。它在标签之间共享。但我不确定这种方法是否合适。需要进一步研究。

    1. 在服务器上捕获HttpAntiForgeryException,检查用户是否已登录。如果用户未登录,则显示一条消息。
    2. 通常使用方法(1)。在银行网站上,当您在其他浏览器选项卡中注销时,他们会使用JavaScript检测到。