web-dev-qa-db-fra.com

Le jeton de cookie anti-contrefaçon et le jeton de champ de formulaire ne correspondent pas dans MVC 4

J'utilise le module de connexion par défaut dans ASP.NET MVC 4. Je n'ai modifié aucun code dans l'application par défaut et je l'ai hébergé sur un serveur partagé.

Après avoir ouvert une session en utilisant la page de connexion par défaut. j'ai gardé le navigateur inactif pendant un certain temps. Ensuite, évidemment, l'application est redirigée vers la page de connexion lorsque j'essaie d'effectuer une action de contrôleur avec [Authorize] attribut.

Ensuite, j'essaye de me connecter à nouveau et cela donne une erreur lorsque je clique sur le bouton de connexion.

The anti-forgery cookie token and form field token do not match.

enter image description here

Action de connexion

// POST: /Account/Login

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Login(LoginModel model, string returnUrl)
        {
            if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
            {
                return RedirectToLocal(returnUrl);
            }

            // If we got this far, something failed, redisplay form
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
            return View(model);
        }
42
chamara

J'ai résolu le problème en ajoutant explicitement une clé machine dans web.config.

Remarque: pour des raisons de sécurité, n'utilisez pas cette clé. Générez-en un à partir de https://support.Microsoft.com/en-us/kb/2915218#AppendixA . N'utilisez pas online-one, details, http://blogs.msdn.com/b/webdev/archive/2014/05/07/asp-net-4-5-2-and-enableviewstatemac.aspx

 <machineKey validationKey="971E32D270A381E2B5954ECB4762CE401D0DF1608CAC303D527FA3DB5D70FA77667B8CF3153CE1F17C3FAF7839733A77E44000B3D8229E6E58D0C954AC2E796B" decryptionKey="1D5375942DA2B2C949798F272D3026421DDBD231757CA12C794E68E9F8CECA71" validation="SHA1" decryption="AES" />

Voici un site qui génère des clés de machine uniques:

http://www.developerfusion.com/tools/generatemachinekey/

46
chamara

Une autre raison de cette erreur est que si vous sautez entre des zones [Autoriser] qui ne sont pas mises en cache par le navigateur (cela serait fait exprès afin d'empêcher les utilisateurs de voir le contenu protégé lorsqu'ils se déconnectent et d'utiliser le bouton de retour par exemple ).

Si tel est le cas, vous pouvez rendre vos actions non mises en cache, donc si quelqu'un clique sur le bouton Retour et se retrouve sur un formulaire avec @ Html.AntiForgeryToken (), le jeton ne sera pas mis en cache auparavant.

Voir cet article pour savoir comment ajouter [NoCache] ActionFilterAttribute: Comment gérer la soumission de formulaire ASP.NET MVC Retour bouton?

9
Yovav

Voici un site qui génère des clés Machnie uniques http://www.developerfusion.com/tools/generatemachinekey/

6
MVCdragon

J'ai eu ce problème pendant longtemps et j'ai supposé que quelque chose n'allait pas avec ASP.NET.

En réalité, c'était le serveur. J'étais alors avec WinHost, et ils ont une limite de mémoire de 200 Mo. Dès que j'avais ~ 20 utilisateurs en même temps, ma limite était atteinte. À ce stade, tout le monde était déconnecté et a signalé ces problèmes.

4
Stachu

assurez-vous de mettre le @ Html.AntiForgeryToken () dans le formulaire de votre page

4
shimron

Pour moi, cela a été causé par l'envoi d'un formulaire à l'aide d'une étiquette de bouton. Changer cela en une balise de soumission d'entrée résout le problème.

3
Mike Upjohn