Asp.Net 当非空用户名不同时 MVC 防伪验证失败...这合理吗?

Asp.Net MVC Antiforgery validation fails when non-null usernames differ...is that reasonable?

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

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

  1. 用户 A 登录并转到页面以创建待办事项,但尚未执行。
  2. 用户 B(实际上在同一台计算机上)在同一浏览器中打开一个新选项卡,注销用户 A 的帐户,然后以用户 B 的身份登录。浏览器然后获取用户 B 的验证 cookie。
  3. 一段时间后,用户 A 切换回原来的选项卡并点击 'create' 他们正在制作的待办事项。

在这种情况下,防伪验证不会通过,因为表单令牌是针对用户 A 的,而验证 cookie 是针对用户 B 的。

我确定此行为有正当的安全原因(例如,另一个站点上的脚本设法以恶意用户身份登录,以便 'todo' 数据被发布到他们的帐户),但它有时不会阻止我的合法用户发生上述情况。

我的问题是:

我看到了两种处理方式:

  1. 在点击按钮之前使用Javascript回调到服务器以检测用户是否仍然登录。如果没有-显示一条消息。这样做应该相对容易。但它需要一个额外的调用,并且需要更多的时间来执行您的请求。

避免回调的一种解决方案是使用 html 5 localStorage(例如,您可以使用 modernizr 在其他浏览器上支持它)。它在选项卡之间共享。但我不确定这种方法是否好。需要进一步研究。

  1. 在服务器上捕获 HttpAntiForgeryException,检查用户是否登录。如果用户未登录,则向他显示一条消息。

通常使用方法(1)。在银行网站上,当您在其他浏览器选项卡中注销时,他们会检测到 JavaScript。