Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 当非空用户名不同时,Asp.NETMVC反伪造验证失败…这合理吗?_Asp.net Mvc_Security_Cookies_Csrf_Antiforgerytoken - Fatal编程技术网

Asp.net mvc 当非空用户名不同时,Asp.NETMVC反伪造验证失败…这合理吗?

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上点击“创建” 在这种情况下,反伪造验证将不会通过

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

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

  • 用户A登录并转到页面创建待办事项,但尚未执行
  • 用户B(物理上在同一台计算机上)在同一浏览器中打开一个新选项卡,注销用户a的帐户,以用户B的身份登录。然后浏览器获取用户B的验证cookie
  • 一段时间后,用户A切换回原来的选项卡,并在他们正在制作的todo上点击“创建”
  • 在这种情况下,反伪造验证将不会通过,因为表单令牌是针对用户A的,而验证cookie是针对用户B的

    我确信这种行为有正当的安全理由(例如,另一个网站上的脚本设法以恶意用户身份登录,以便将“todo”数据发布到他们的帐户),但这并不能阻止我的合法用户有时出现上述情况

    我的问题是:

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

      • 我认为有两种处理方法:

      • 在按下按钮检测用户是否仍然登录之前,使用Javascript回调服务器。如果没有-向他显示消息。这应该相对容易做到。但是它需要一个额外的调用,并且需要多一点时间来执行您的请求
      • 避免回调的一个解决方案是使用HTML5LocalStorage(例如,您可以在使用Modernizer的其他浏览器上支持它)。它在选项卡之间共享。但我不确定这种方法是否好。需要进行额外的研究

      • 在服务器上捕获HttpAntiforyException,检查用户是否登录。如果用户未登录,则向其显示消息

      • 通常使用方法(1)。在银行网站上,当您登录到其他浏览器选项卡时,他们会用JavaScript检测到您的回答。

        我将您的回答标记为已接受,因为您提出了两种/三种合理的处理方法#2可能对我来说不太好,因为我的应用程序也支持匿名帖子,但你的回答让我思考了很多。也许我会在所有情况下重定向到登录页面,显示一条涵盖所有情况的通用消息(比如“出于安全原因,我们需要您再次登录(如果这种情况持续存在,请检查您是否启用了cookies,是否打开了其他选项卡,以及是否没有其他用户同时登录等)”)。再次感谢您的时间:)(但这种重定向方法的一个问题可能是用户的post数据丢失,他们必须在登录后重新键入所有“待办事项”信息:()@sammy34为了避免丢失信息,您可以实现保存控件信息的通用方法。只需将特定页面上的所有控件序列化到localStorage。如果用户再次访问该页面,则提示从localStorage恢复信息(如果存在)。对于此操作,也可以实现“撤消”。