web-dev-qa-db-fra.com

MVC 4 a fourni un jeton anti-contrefaçon destiné à l'utilisateur "" mais l'utilisateur actuel est "utilisateur"

J'ai récemment mis en ligne une application web qui a été construite en utilisant MVC 4 et Entity Framework 5. L'application MVC utilise Razor Views.

J'ai remarqué en utilisant Elmah que lorsque les utilisateurs se connectent à l'application, ils obtiennent parfois l'erreur suivante

The provided anti-forgery token was meant for user "" but the current user is "user"

J'ai déjà fait un peu de recherche sur la façon de résoudre ce problème, mais rien ne semble fonctionner pour moi. Veuillez voir mon Vue de connexion et correspondant Actions du contrôleur ci-dessous.

Vue rasoir

@if (!HttpContext.Current.User.Identity.IsAuthenticated)
{

using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

     <div class="formEl_a">

        <fieldset>
            <legend>Login Information</legend>

            <div class="lbl_a">
                Email
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Email, new { @class = "inpt_a" })<br />
                @Html.ValidationMessageFor(m => m.Email)
            </div>

            <div class="lbl_a">
                @Html.LabelFor(m => m.Password)
            </div>
            <div class="editor-field sepH_b">
                @Html.PasswordFor(m => m.Password, new { @class = "inpt_a" })<br />
                @Html.ValidationMessageFor(m => m.Password)
            </div>


        </fieldset>
    </div>
    <br />
      <p>
            <input type="submit" value="Log In" class="btn btn_d sepV_a" />
        </p>

}    
}

Contrôleur

[AllowAnonymous]
public ActionResult Login()
{
     return View();
}

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
     if (ModelState.IsValid && _accountService.Logon(model.Email, model.Password, true))
     {
          //Validate
     }
     else
     {
          // inform of failed login
      }

}

Je pensais que tout semblait correct, mais l'erreur persiste. Quelqu'un at-il des idées sur la façon de résoudre ce problème?

Votre aide est grandement appréciée.

Merci.

18
tcode

Je crois que cela se produit parce que les utilisateurs double-cliquent sur le bouton Envoyer du formulaire. Du moins, c'est EXACTEMENT le cas sur mon site.

Dépannage des problèmes de jetons anti-contrefaçon

17
ganders

Le code de validation qui s'exécute sur un AntiForgeryToken vérifie également que vos informations d'identification d'utilisateur n'ont pas changé - elles sont également cryptées dans le cookie. Cela signifie que si vous vous êtes connecté ou déconnecté dans une fenêtre contextuelle ou un autre onglet du navigateur, la soumission de votre formulaire échouera à l'exception suivante:

System.Web.Mvc.HttpAntiForgeryException (0x80004005):
The provided anti-forgery token was meant for user "", but the current user is "SomeOne".

Vous pouvez désactiver cela en mettant AntiForgeryConfig.SuppressIdentityHeuristicChecks = true; dans Application_Start méthode à l'intérieur Global.asax fichier.

Lorsqu'un AntiForgeryToken ne valide pas votre site Web lèvera une exception de type System.Web.Mvc.HttpAntiForgeryException. Vous pouvez rendre cela un peu plus facile en donnant au moins à l'utilisateur une page plus informative ciblée sur ces exceptions en interceptant l'exception HttpAntiForgeryException.

private void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();

    if (ex is HttpAntiForgeryException)
    {
        Response.Clear();
        Server.ClearError(); //make sure you log the exception first
        Response.Redirect("/error/antiforgery", true);
    }
}

Plus d'informations:

Le jeton anti contrefaçon est destiné à l'utilisateur "" mais l'utilisateur actuel est "nom d'utilisateur"

Html.AntiForgeryToken - Équilibrer la sécurité et la convivialité

11
Mohsen Esmailpour

J'ai eu le même problème quand

  • L'utilisateur se connecte
  • Ensuite, sur la page d'accueil, l'utilisateur clique sur le bouton Retour pour revenir à la connexion
  • L'utilisateur se connecte en tant qu'utilisateur différent
  • Cela donnait l'exception: le jeton anti-contrefaçon fourni était destiné à l'utilisateur "" mais l'utilisateur actuel est "utilisateur"

J'ai trouvé que cela ne se produisait que dans IE et je l'ai corrigé en faisant quelques choses

  1. Désactivation de la mise en cache de sortie pour la page de connexion, car en mode débogage, j'ai constaté que le fait de cliquer sur le bouton Précédent n'a pas généré de nouvelle demande sur la page de connexion
  2. Sur la page de connexion, j'ai ajouté une vérification pour voir si l'utilisateur est déjà authentifié, et si c'est le cas, il s'est déconnecté, puis redirigé vers la page de connexion.

    [AllowAnonymous]
    [OutputCache(NoStore=true, Location=System.Web.UI.OutputCacheLocation.None)]
    public ActionResult Login)
    {
        if (HttpContext.Request.IsAuthenticated)
        {
            WebSecurity.Logout();
            Session.Abandon();
            return RedirectToAction("Login");
        }
    
        return View();
    }
    
0
Sandhya