解决方法:提供的防伪令牌是针对与当前用户不同的基于索赔的用户

Joh*_*Doe 6 c# asp.net-mvc

我收到此错误:

The provided anti-forgery token was meant for a different claims-based user than the current user.
Run Code Online (Sandbox Code Playgroud)

我不确定如何更正此问题。

我有一个MVC5网站,在这个网站上有一个登录页面。

这就是它发生的场景。

  1. 用户AAA登录。(无问题)
  2. 我尝试访问用户无权访问的视图。
    • 我的班级装饰有Authorize(Roles =“ aa”)
  3. 然后,该视图将用户注销,并将其放回登录页面。
  4. 用户AAA登录。(这一次,我收到上述错误)

注意:
我正在使用customErrors,这是我看到错误消息的地方。

当我注销用户时,我正在运行此方法:

[HttpGet]
public void SignOut()
{
    IAuthenticationManager authenticationManager = HttpContext.GetOwinContext().Authentication;
    authenticationManager.SignOut(MyAuthentication.ApplicationCookie);
}
Run Code Online (Sandbox Code Playgroud)

我可能会在SignOut上丢失某些内容吗?

更新:
仅由于上面列出的第2步而发生。
如果我登录,然后注销(调用相同的代码),然后重新登录,那么我没有这个问题。

Chr*_*att 6

我认为您忽略了发布一些相关的代码。Signout您执行的操作将返回void。如果您要直接在浏览器中访问此操作,则该用户在退出后将无法获得前进的方式得到空白页。结果,我只能假设您要么通过AJAX调用它,要么作为另一个动作的方法调用。

MVC中防伪的工作方式是在用户计算机上设置一个cookie,其中包含唯一的生成令牌。如果用户已登录,则使用其用户名来编写该令牌。为了使新的cookie,而无需用户名进行设置,用户必须注销新的要求,必须进行设置新的cookie。如果您仅注销用户而不进行重定向或其他操作,则尚未设置新的无用户cookie。然后,当用户发帖时,旧的基于用户的cookie会被发回,而MVC正在寻找新的无用户的cookie,然后繁荣起来:这是您的例外。

就像我说的那样,您尚未发布足够的代码来确定发生这种情况的原因或确切位置,只是简单地确保在注销用户后有一个新的请求,以便可以设置新的cookie。