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基本上处于过期状态。在这里,您唯一能做的就是改进系统处理它的方式 例如,我建议从控制器操作中验
有什么解决办法吗 这是防伪令牌验证的正确行为。选项卡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+世界。