Asp.net mvc 当非空用户名不同时,Asp.NETMVC反伪造验证失败…这合理吗?
我的问题是关于MVC防伪系统(描述) 考虑一个将Todo发布到/Todo/Create的简单应用程序。相应的操作方法具有Asp.net mvc 当非空用户名不同时,Asp.NETMVC反伪造验证失败…这合理吗?,asp.net-mvc,security,cookies,csrf,antiforgerytoken,Asp.net Mvc,Security,Cookies,Csrf,Antiforgerytoken,我的问题是关于MVC防伪系统(描述) 考虑一个将Todo发布到/Todo/Create的简单应用程序。相应的操作方法具有ValidateAntiForgeryToken属性。考虑以下客户端工作流: 用户A登录并转到页面创建待办事项,但尚未执行 用户B(物理上在同一台计算机上)在同一浏览器中打开一个新选项卡,注销用户a的帐户,以用户B的身份登录。然后浏览器获取用户B的验证cookie 一段时间后,用户A切换回原来的选项卡,并在他们正在制作的todo上点击“创建” 在这种情况下,反伪造验证将不会通过
ValidateAntiForgeryToken
属性。考虑以下客户端工作流:
- 是否有“最佳实践”方法来处理这种情况?通常只是显示自定义错误,告诉他们重新加载页面和/或再次登录等情况吗李>
- 有没有办法知道开箱即用的MVC Antiforgery系统何时会遇到此错误?它似乎只会抛出相同类型的异常(
)。我是否需要恢复到使用/修改其源代码httpantiforyexception
- 在按下按钮检测用户是否仍然登录之前,使用Javascript回调服务器。如果没有-向他显示消息。这应该相对容易做到。但是它需要一个额外的调用,并且需要多一点时间来执行您的请求 避免回调的一个解决方案是使用HTML5LocalStorage(例如,您可以在使用Modernizer的其他浏览器上支持它)。它在选项卡之间共享。但我不确定这种方法是否好。需要进行额外的研究
- 在服务器上捕获HttpAntiforyException,检查用户是否登录。如果用户未登录,则向其显示消息
- 我认为有两种处理方法:
通常使用方法(1)。在银行网站上,当您登录到其他浏览器选项卡时,他们会用JavaScript检测到您的回答。我将您的回答标记为已接受,因为您提出了两种/三种合理的处理方法#2可能对我来说不太好,因为我的应用程序也支持匿名帖子,但你的回答让我思考了很多。也许我会在所有情况下重定向到登录页面,显示一条涵盖所有情况的通用消息(比如“出于安全原因,我们需要您再次登录(如果这种情况持续存在,请检查您是否启用了cookies,是否打开了其他选项卡,以及是否没有其他用户同时登录等)”)。再次感谢您的时间:)(但这种重定向方法的一个问题可能是用户的post数据丢失,他们必须在登录后重新键入所有“待办事项”信息:()@sammy34为了避免丢失信息,您可以实现保存控件信息的通用方法。只需将特定页面上的所有控件序列化到localStorage。如果用户再次访问该页面,则提示从localStorage恢复信息(如果存在)。对于此操作,也可以实现“撤消”。