Asp.Net 当非空用户名不同时 MVC 防伪验证失败...这合理吗?
Asp.Net MVC Antiforgery validation fails when non-null usernames differ...is that reasonable?
我的问题是关于 MVC 防伪造系统(描述 here)。
考虑一个将待办事项发布到 /Todo/Create 的简单应用。相应的操作方法具有 ValidateAntiForgeryToken
属性。考虑以下客户端工作流程:
- 用户 A 登录并转到页面以创建待办事项,但尚未执行。
- 用户 B(实际上在同一台计算机上)在同一浏览器中打开一个新选项卡,注销用户 A 的帐户,然后以用户 B 的身份登录。浏览器然后获取用户 B 的验证 cookie。
- 一段时间后,用户 A 切换回原来的选项卡并点击 'create' 他们正在制作的待办事项。
在这种情况下,防伪验证不会通过,因为表单令牌是针对用户 A 的,而验证 cookie 是针对用户 B 的。
我确定此行为有正当的安全原因(例如,另一个站点上的脚本设法以恶意用户身份登录,以便 'todo' 数据被发布到他们的帐户),但它有时不会阻止我的合法用户发生上述情况。
我的问题是:
- 是否有 'best practices' 方法来处理这种情况?通常只是显示自定义错误,告诉他们重新加载页面 and/or 再次登录等吗?
- 有什么方法可以知道开箱即用的 MVC 防伪系统何时会遇到此错误?它似乎只抛出相同类型的异常 (
HttpAntiForgeryException
)。我需要恢复到 using/modifying 他们的来源吗?
我看到了两种处理方式:
- 在点击按钮之前使用Javascript回调到服务器以检测用户是否仍然登录。如果没有-显示一条消息。这样做应该相对容易。但它需要一个额外的调用,并且需要更多的时间来执行您的请求。
避免回调的一种解决方案是使用 html 5 localStorage(例如,您可以使用 modernizr 在其他浏览器上支持它)。它在选项卡之间共享。但我不确定这种方法是否好。需要进一步研究。
- 在服务器上捕获 HttpAntiForgeryException,检查用户是否登录。如果用户未登录,则向他显示一条消息。
通常使用方法(1)。在银行网站上,当您在其他浏览器选项卡中注销时,他们会检测到 JavaScript。
我的问题是关于 MVC 防伪造系统(描述 here)。
考虑一个将待办事项发布到 /Todo/Create 的简单应用。相应的操作方法具有 ValidateAntiForgeryToken
属性。考虑以下客户端工作流程:
- 用户 A 登录并转到页面以创建待办事项,但尚未执行。
- 用户 B(实际上在同一台计算机上)在同一浏览器中打开一个新选项卡,注销用户 A 的帐户,然后以用户 B 的身份登录。浏览器然后获取用户 B 的验证 cookie。
- 一段时间后,用户 A 切换回原来的选项卡并点击 'create' 他们正在制作的待办事项。
在这种情况下,防伪验证不会通过,因为表单令牌是针对用户 A 的,而验证 cookie 是针对用户 B 的。
我确定此行为有正当的安全原因(例如,另一个站点上的脚本设法以恶意用户身份登录,以便 'todo' 数据被发布到他们的帐户),但它有时不会阻止我的合法用户发生上述情况。
我的问题是:
- 是否有 'best practices' 方法来处理这种情况?通常只是显示自定义错误,告诉他们重新加载页面 and/or 再次登录等吗?
- 有什么方法可以知道开箱即用的 MVC 防伪系统何时会遇到此错误?它似乎只抛出相同类型的异常 (
HttpAntiForgeryException
)。我需要恢复到 using/modifying 他们的来源吗?
我看到了两种处理方式:
- 在点击按钮之前使用Javascript回调到服务器以检测用户是否仍然登录。如果没有-显示一条消息。这样做应该相对容易。但它需要一个额外的调用,并且需要更多的时间来执行您的请求。
避免回调的一种解决方案是使用 html 5 localStorage(例如,您可以使用 modernizr 在其他浏览器上支持它)。它在选项卡之间共享。但我不确定这种方法是否好。需要进一步研究。
- 在服务器上捕获 HttpAntiForgeryException,检查用户是否登录。如果用户未登录,则向他显示一条消息。
通常使用方法(1)。在银行网站上,当您在其他浏览器选项卡中注销时,他们会检测到 JavaScript。