[AntiforgeryValidationException,当尝试通过两个不同的选项卡登录时]

问题描述 投票:2回答:2

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

  1. 用户A来自选项卡1的日志(无问题)
  2. [不刷新选项卡2,用户B尝试登录。重定向到400页。

((异常:Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException:提供的反伪造令牌是针对与当前用户不同的基于声明的用户的。)

有解决方案吗?

c# asp.net-core antiforgerytoken
2个回答
2
投票

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

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


0
投票

我同意@ matt-shepherd,这是防伪令牌验证的正确行为。选项卡B处于过期状态,因为选项卡B中的令牌不反映我们已经登录了选项卡A the anti forgery token includes the username

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

相反,由于Patrick Westerhoff's pull request that was merged to ASP.NET Core 2.2 code base,我创建了一个从IAsyncAlwaysRunResultFilter继承的过滤器:

public class RedirectAntiforgeryValidationFailedResultFilter : IAsyncAlwaysRunResultFilter
  {
    public Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
    {
      if (context.Result is AntiforgeryValidationFailedResult)
      {
        context.Result = new RedirectToPageResult("/AntiForgeryError");
      }

      return next();
    }
  }

我创建了一个名为AntiForgeryError的剃刀页面。

最后,我已将我的应用程序配置为使用RedirectAntiforgeryValidationFailedResultFilter中的Startup.cs

services.AddMvc(options => options.Filters.Add<RedirectAntiforgeryValidationFailedResultFilter>())
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
© www.soinside.com 2019 - 2024. All rights reserved.