步骤:登录页面在两个不同的选项卡中打开。
((异常:Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException:提供的反伪造令牌是针对与当前用户不同的基于声明的用户的。)
有解决方案吗?
这是防伪令牌验证的正确行为。选项卡B本质上处于过期状态。您在这里唯一能做的就是改善系统处理它的方式。
例如,我建议从within控制器操作而不是使用属性来验证令牌。为此,只需将此行用作您的操作的第一行:System.Web.Helpers.AntiForgery.Validate();
。现在,您可以捕获任何抛出的HttpAntiForgeryException
并相应地响应用户。例如告诉用户他们已经登录,或者需要刷新页面(以适合您系统的方式为准)。
我同意@ 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);