【问题标题】:LogOff Issue: The provided anti-forgery token was meant for a different claims-based user than the current user注销问题:提供的防伪令牌适用于与当前用户不同的基于声明的用户
【发布时间】:2018-01-12 04:56:12
【问题描述】:

我在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.Abandon()

【问题讨论】:

  • 这是预期的行为,但您可以使用 AntiForgery.Validate() 在代码中手动处理,而不是使用 [ValidateAntiForgeryToken]
  • 当用户在注销或发布表单后使用返回按钮时,您会经常看到这种情况,因此值得为用户优雅地处理,因为这是正确的行为。

标签: asp.net-mvc


【解决方案1】:

这正是应该发生的事情。第二个用户没有什么可以注销的,因为他已经注销了。所以没关系。

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

为此,您需要一些异常处理程序并在其中处理 HttpAntiForgeryException

【讨论】:

  • 谢谢。您的建议对我有帮助。我在 customerrorattribte 中添加了代码 if (ex is HttpAntiForgeryException) { filterContext.Result = new RedirectResult("~/Account/Login"); }
【解决方案2】:

它可以正常工作,您现在需要做的只是尝试捕获检查,然后在这种情况下将用户重定向到登录页面

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2015-02-01
    • 2013-04-30
    • 2016-03-19
    • 2013-12-18
    • 2020-05-31
    相关资源
    最近更新 更多