我收到此错误:
The provided anti-forgery token was meant for a different claims-based user than the current user.
我不知道如何纠正这个......
我有一个MVC5网站,在这个网站上我有一个登录页面。
这是它发生的情况。
注意:
我正在使用customErrors,这是我看到错误消息的地方。
当我将用户注销时,我正在运行此方法:
[HttpGet]
public void SignOut()
{
IAuthenticationManager authenticationManager = HttpContext.GetOwinContext().Authentication;
authenticationManager.SignOut(MyAuthentication.ApplicationCookie);
}
我可能会遗漏SignOut上的内容吗?
更新:
这只是因为上面列出的步骤#2而发生的。
如果我登录,然后注销(调用相同的代码)然后重新登录,那么我没有这个问题。
答案 0 :(得分:5)
我认为你忽略了发布一些相关的代码。您的Signout
操作会返回void
。如果您要直接在浏览器中访问此操作,则用户在注销后将无法继续前进时获得空白页面。因此,我只能假设您要么通过AJAX调用它,要么从另一个动作调用方法。
反伪造在MVC中的工作方式是在用户的机器上设置一个包含唯一生成令牌的cookie。如果用户已登录,则使用其用户名撰写该令牌。为了在没有设置用户名的情况下创建新cookie,用户必须注销并且必须发生新请求才能设置新cookie。如果您只是在不进行重定向的情况下将用户注销,那么新的无用户cookie将不会被设置。然后,当用户发布时,旧的基于用户的cookie被发回,而MVC正在寻找新的无用户cookie,并且繁荣:这是你的例外。
就像我说的那样,你没有发布足够的代码来确定发生这种情况的原因或确切位置,但是,只需确保在用户注销后发出新请求,这样就可以设置新的cookie。 / p>
答案 1 :(得分:0)
禁用防伪验证执行的身份检查。将以下内容添加到Application_Start方法中:
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true.
答案 2 :(得分:0)
尝试:
public ActionResult Login(string modelState = null)
{
if (modelState != null)
ModelState.AddModelError("", modelState);
return View();
}
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model)
{
AuthenticationManager.SignOut();
return RedirectToAction("Login", "Controller", new { modelState = "MSG_USER_NOT_CONFIRMED" });
}
答案 3 :(得分:0)
在下一个视图加载之前,我可以多次单击登录按钮进行复制。第一次单击后,我禁用了登录按钮,以防止出现该错误。
<button type="submit" onclick="this.disabled=true;this.form.submit();"/>
答案 4 :(得分:0)
我有类似的问题。我在我的项目的2个地方找到了此文本“ @ Html.AntiForgeryToken()”。麻烦的是在“查看文件”视图中-test.cshtml。
@using (Html.BeginForm())
@Html.AntiForgeryToken()
<div class="form-horizontal">
<div class="form-group">
@if (@Model.interviewed)
...
我删除了此代码行(“ @ Html.AntiForgeryToken()”)并正常工作。
PS:但是,我不会在文件_LoginPartial.cshtml中删除此代码。 祝你好运!