J'ai été en passant par les journaux d'erreur d'un projet de développement et a trouvé le message d'erreur suivant (le nom a été changé pour protéger le coupable innocent)-
La lutte contre la falsification de jeton a été conçu pour l'utilisateur "", mais le courant l'utilisateur est "admin".
Ce n'était pas particulièrement difficile à reproduire-
- Ouvrez l'application sur la page de connexion
- Ouvrir une deuxième fenêtre ou un onglet dans le même navigateur sur le même ordinateur à la page de connexion avant de vous connecter
- De connexion dans la première fenêtre (ou le deuxième, l'ordre n'a pas d'importance)
- Tentative de connexion dans le reste de la fenêtre de connexion
La trace de la pile est-
Système.Web.Mvc.HttpAntiForgeryException (0x80004005): La condition anti-faux jeton a été conçu pour l'utilisateur "", mais l'utilisateur actuel est "admin". au Système.Web.Les aides.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext, l'Identité de l'identité, AntiForgeryToken sessionToken, AntiForgeryToken fieldToken) à Système.Web.Les aides.AntiXsrf.AntiForgeryWorker.Valider(HttpContextBase httpContext) au Système.Web.Les aides.AntiForgery.Valider() à Système.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization(AuthorizationContext filterContext) à Système.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filtres, ActionDescriptor actionDescriptor) au Système.Web.Mvc.Async.AsyncControllerActionInvoker.<>c_DisplayClass25.b_1e(AsyncCallback asyncCallback, Objet asyncState)
Le login de la signature de la méthode est-
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
...
}
C'est exactement la même que la signature de la méthode dans un internet "ASP.NET MVC 4 Web Application" basé sur un modèle de projet, ce qui indique que Microsoft soit senti le ValidateAntiForgeryToken était nécessaire/le meilleur de la pratique, ou simplement ajouté l'attribut ici, car il était utilisé partout ailleurs.
Évidemment, il n'y a rien que je peux faire pour traiter le problème dans cette méthode car elle n'est pas atteint, le ValidateAntiForgeryToken est un pré-filtre de requête et c'est le blocage de la demande avant qu'il n'atteigne le contrôleur.
J'ai pu vérifier si l'utilisateur est authentifié via Ajax avant de soumettre le formulaire et de tenter de le rediriger vers eux, si oui, ou tout simplement de supprimer l'attribut.
La question est-ce - que je comprends que le jeton est conçu pour empêcher les demandes à partir d'un autre site (CSRF) lorsque l'utilisateur est déjà authentifié sur votre site alors, sur cette base est-il un problème pour l'enlever à partir d'un formulaire qui, par définition, sera utilisé par des utilisateurs non authentifiés?
Sans doute l'attribut dans ce cas est conçu pour atténuer les acteurs malveillants fournissant de faux formulaires de connexion pour votre application (même si, à l'époque de l'exception est levée, vraisemblablement, l'utilisateur est déjà entré dans ses détails qui ont été enregistrés, mais il peut alerter de quelque chose qui est faux). Soumettez des informations d'identification incorrectes à la forme d'un site externe résultat sera exactement le même résultat que sur le site lui-même, dites-vous? Je ne suis pas en s'appuyant sur la validation du client/de l'assainissement pour nettoyer potentiellement dangereux d'entrée.
Avoir d'autres devs rencontré ce problème (ou ne nous ont exceptionnellement les utilisateurs créatifs) et si oui, comment avez-vous résolu/atténués il?
Mise à jour: Ce problème existe toujours dans MVC5, entièrement intentionnellement, maintenant avec le message d'erreur "La lutte contre la falsification de jeton a été conçu pour une autre basée sur les revendications de l'utilisateur que l'utilisateur actuel." lors de l'utilisation de ce modèle par défaut et de l'Identité des fournisseurs. Il y a une question pertinente et intéressante réponse de Microsoft Developer Evangelist et Troy autres PluralSight l'auteur Adam Tuliper à Anti faux jeton sur la page de login qui recommande simplement de retirer le jeton.