Asp.net mvc 注销问题:提供的防伪令牌用于与当前用户不同的基于声明的用户

Asp.net mvc 注销问题:提供的防伪令牌用于与当前用户不同的基于声明的用户,asp.net-mvc,Asp.net Mvc,我在AccountController中有以下LogOff功能: [ValidateAntiForgeryToken] public ActionResult LogOff() { Session.Remove("UserName"); Session.Remove("UserRoleId"); AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); Authent

我在
AccountController
中有以下
LogOff
功能:

[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    Session.Remove("UserName");
    Session.Remove("UserRoleId"); 
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
    AuthenticationManager.SignOut();
    Session.Abandon();
    Session.Clear();
    Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
    return RedirectToAction("Login", "Account");
}
现在假设我有两个浏览器选项卡打开。如果我从第一个页面注销,它工作正常。现在成功注销后,如果我再次从第二个窗口单击注销按钮,它会显示错误: “提供的防伪令牌是针对与当前用户不同的基于声明的用户。

我知道很多用户已经问过这个问题,但是这些答案 没有解决我的问题。我还在这里使用了
Session.discard()


这正是应该发生的事情。第二个用户没有任何要注销的内容,因为他已注销。那很好

您的问题是自定义错误显示给用户。您肯定希望显示一些自定义消息,为用户提供更多信息和更少的技术细节


为了做到这一点,您需要一些异常处理程序,并在其中处理
httpantiforyexception

,这正是应该发生的。第二个用户没有任何要注销的内容,因为他已注销。那很好

您的问题是自定义错误显示给用户。您肯定希望显示一些自定义消息,为用户提供更多信息和更少的技术细节


为了做到这一点,您需要一些异常处理程序,并在其中处理
httpantiforyexception

它正常工作,您现在需要做的是一个try-catch检查,然后在此场景中将用户重定向到登录页面它正常工作,您现在需要做的是try-catch检查,然后继续此场景将用户重定向到登录页面

这是预期的行为,但您可以使用
[ValidateAntiForgeryToken]
在代码中手动处理当用户在注销或发布表单后使用“后退”按钮时,您会经常看到这种情况,因为它是正确的行为,因此值得用户优雅地处理。这是预期的行为,但您可以使用
[ValidateAntiForgeryToken]
在代码中手动处理
AntiForgery.Validate()
当用户在注销或发布表单后使用“后退”按钮时,您会经常看到这一点,该表单值得用户优雅地处理,因为它是正确的行为。谢谢。你的建议对我很有帮助。如果(例如HttpAntiforyException){filterContext.Result=new RedirectResult(“~/Account/Login”);}谢谢,我在customerrorattribte中添加了代码。你的建议对我很有帮助。如果(例如HttpAntiforyException){filterContext.Result=new RedirectResult(“~/Account/Login”);,我在customerrorattribte中添加了代码