Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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
C# 尝试通过两个不同选项卡登录时出现AntiforgeryValidationException_C#_Asp.net Core_Antiforgerytoken - Fatal编程技术网

C# 尝试通过两个不同选项卡登录时出现AntiforgeryValidationException

C# 尝试通过两个不同选项卡登录时出现AntiforgeryValidationException,c#,asp.net-core,antiforgerytoken,C#,Asp.net Core,Antiforgerytoken,步骤如下: 登录页面在两个不同的选项卡中打开 用户A从选项卡1记录日志(无问题) 在不刷新选项卡2的情况下,用户B尝试登录。 重定向到400页 (例外:Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException:提供的Antiforgery令牌用于与当前用户不同的基于声明的用户。) 有什么解决办法吗 这是防伪令牌验证的正确行为。选项卡B基本上处于过期状态。在这里,您唯一能做的就是改进系统处理它的方式 例如,我建议从控制器操作中验

步骤如下: 登录页面在两个不同的选项卡中打开

  • 用户A从选项卡1记录日志(无问题)
  • 在不刷新选项卡2的情况下,用户B尝试登录。 重定向到400页
  • (例外:Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException:提供的Antiforgery令牌用于与当前用户不同的基于声明的用户。)


    有什么解决办法吗

    这是防伪令牌验证的正确行为。选项卡B基本上处于过期状态。在这里,您唯一能做的就是改进系统处理它的方式


    例如,我建议从控制器操作中验证令牌,而不是使用属性。为此,只需将这一行用作操作的第一行:
    System.Web.Helpers.AntiForgery.Validate()。您现在可以捕获抛出的任何
    httpantiforyexception
    ,并相应地响应用户。e、 g.告诉用户他们已经登录,或者他们需要刷新页面,以适合您的系统为准。

    我同意@matt shepherd的观点,这是防伪令牌验证的正确行为。选项卡B处于过期状态,因为选项卡B中的令牌未反映我们已登录到选项卡A

    我在这里发布另一个答案,因为在我的应用程序中(.Net Core 2.2使用asp.Net Core标识和razor页面)
    System.Web.Helpers.AntiForgery.Validate()
    不可用。因此我无法按照@matt shepherd的建议验证控制器操作中的令牌

    相反,由于以下原因,我创建了一个从IAsyncAlwaysRunResultFilter继承的筛选器:

    公共类重定向AntiforgeryValidationFailedResultFilter:IAsyncAlwaysRunResultFilter
    {
    ResultExecutionAsync上的公共任务(ResultExecutionContext,ResultExecutionDelegate next)
    {
    if(context.Result为AntiforgeryValidationFailedResult)
    {
    context.Result=new RedirectToPageResult(“/AntiForgeryError”);
    }
    返回next();
    }
    }
    
    我已经创建了一个名为
    AntiForgeryError
    的razor页面

    最后,我已将我的应用程序配置为使用
    Startup.cs
    中的
    重定向AntiforgeryValidationFailedResultFilter

    services.AddMvc(options=>options.Filters.Add())
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    
    是否有任何演示来重现您的问题?选项卡是由
    Asp.Net核心视图
    还是
    角度视图
    实现的?您如何在选项卡中配置
    Antifforgery
    ?您是否将
    Antifforgery
    放在不同的选项卡中,还是放在选项卡外的主页上?您是如何在
    Startup
    中配置
    Antiforgery
    的?是的,我使用的是Asp.Net核心视图。我的登录视图中有“@Html.AntiForgeryToken()”[ValidateAntiForgeryToken]”属性已添加到控制器中的我的登录操作中。对不起,我没有现场演示给你看…你是如何通过登录实现两个选项卡的?1。进入登录页面2。复制选项卡(因此现在您有两个带有登录页的选项卡)3。从选项卡1,用户A登录(无问题。登录成功)4。现在,请尝试从选项卡2登录而不刷新它(由同一个登录用户或不同的登录用户登录)。(***出现异常并重定向到400页)与我们分享复制您的问题的完整步骤。默认情况下,用户登录将刷新页面,您是如何避免刷新的?这也是对.NET Core 2.2的一个很好的回答,谢谢@Yanal YvesI。我非常感谢您的回答。我最终首先找到了Patrick Westerhoff的公关,但对于作为例外处理它的其他问题,这个网站上有很多陈旧的答案,这不适用于Core 2.2+世界。