如何解决:提供的防伪令牌适用于与当前用户不同的基于声明的用户

时间:2017-01-03 14:28:26

标签: c# asp.net-mvc

我收到此错误:

The provided anti-forgery token was meant for a different claims-based user than the current user.

我不知道如何纠正这个......

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

这是它发生的情况。

  1. 用户AAA登录。(无问题)
  2. 我尝试访问用户无权访问的视图。
    • 我的课程上饰有授权(Roles =" aa")
  3. 该视图会关闭用户并将其放回登录页面。
  4. 用户AAA登录。(这次我收到上述错误)
  5. 注意:
    我正在使用customErrors,这是我看到错误消息的地方。

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

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

    我可能会遗漏SignOut上的内容吗?

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

5 个答案:

答案 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中删除此代码。 祝你好运!