MVC5 AntiForgeryToken - comment gérer “La lutte contre la falsification de jeton a été conçu pour l'utilisateur ”“, mais l'utilisateur actuel est ”xxx“.” l'exception"?
Je veux protéger notre connexion actions par AntiforgeryToken attribut - je sais pourquoi l'exception de la rubrique se produit, cependant je n'arrive pas à trouver une bonne solution pour elle.
Disons que nous avons l'une des situations suivantes:
- Il est 8:00 du matin, les utilisateurs de l'application sont à venir au travail, ils s'asseoir et de commencer le processus de connexion - pour l'instant il est très possible que certains utilisateurs auront la même ValidationToken. Après la première journaux dans toutes les autres verront l'exception ci-dessus (ou une autre exception personnalisée de l'écran) lors de leur tentative de connexion.
- De l'utilisateur connecté, puis appuyez accidentellement sur la "retour" et tenté de vous connecter à nouveau - ce qui est plus rare, il peut arriver, et je ne veux pas que les utilisateurs voient des exceptions quand il ne.
La question est donc simple - comment prévenir les situations ci-dessus, ou comment les gérer de sorte que les utilisateurs ne remarqueront rien. J'ai essayé ce qui suit:
- Réglage de la AntiForgeryConfig.SuppressIdentityHeuristicChecks = true; dans Application_Start Mondiale.asax - il n'a pas de résoudre le problème, j'obtiens toujours la même exception
- Réglage de la [OutputCache(NoStore = true, Durée = 0, VaryByParam = "None")] sur la méthode avec [ValidateAntiForgeryToken] attribut - encore une fois, pas de chance, il y
Droit maintenant, je pensais à manuellement valider le jeton dans l'action du corps, de capture de l'erreur, et de vérifier si la tentative a été faite par utilisateur anonyme:
public ActionResult SomeAction()
{
try
{
AntiForgery.Validate();
}
catch(HttpAntiForgeryException ex)
{
if(String.IsNullOrEmpty(HttpContext.User.Identity.Name))
{
throw;
}
}
//Rest of action body here
//..
//..
}
Ci-dessus semble éviter les erreurs - mais est-il sûr? Quelles sont les alternatives?
Merci d'avance.
Meilleures salutations.
EDIT:
La dernière "solution" est de désactiver jeton de validation sur le formulaire de connexion: il y a peut-être une meilleure façon de le gérer, mais il semble que toutes les solutions que j'ai trouvées, étaient laids solutions similaires à la mienne proposé ci-dessus.
Car il n'y a aucun moyen de savoir combien de "coffre-fort", ces alternatives sont (si ils sont en sécurité en tout), nous avons décidé de faire désactiver jeton de validation lors de la connexion.
Salut, je vais avoir le même problème lorsque l'utilisateur appuie sur bouton retour du navigateur. Qu'avez-vous de la fin?
Voir la section EDIT de ma question - puisque seul le formulaire de connexion nous a donné ce problème, en fin de compte, nous avons juste désactivé le jeton de validation. Nous avons décidé qu'il n'était tout simplement pas en vaut la peine et franchement, je ne pouvais pas trouver tout "propre" solution - seuls les moches, les solutions de contournement (comme celle, que j'ai posté avec le try-catch).
OriginalL'auteur user2384366 | 2015-09-18
Vous devez vous connecter pour publier un commentaire.
Essayer de réglage (dans le global.cs):
Cela va ajouter le nom de l'identifiant de votre jeton,
Comme pour le double problème de connexion, essayez d'utiliser un script de document, la date et l'heure de l'original soumettre à arrêter un deuxième présenter avec le même jeton.
Donc, nous savons une chose; les utilisateurs comme le bouton de retour et ont l'habitude de le "double clic", c'est un gros problème avec AntiforgeryToken.
Mais selon ce que votre application n', il existe des moyens de limiter leur compulsion à faire. Le plus simple est de faire de votre mieux pour essayer de le faire le visiteur se sentent pas comme ils ont besoin de “rembobiner” leur demande de le modifier.
“What's going on?” - Garder l'utilisateur au courant
Lorsqu'un AntiForgeryToken ne pas valider votre site web va lever une Exception de type System.Web.Mvc.HttpAntiForgeryException.
Si vous avez configuré correctement, vous avez amicale des erreurs allumé et cela signifie que votre page d'erreur n'affichera pas une Exception et montrer une belle page d'erreur qui leur dit ce qu'il est.
Vous pouvez rendre cela un peu plus facile en moins de donner à l'utilisateur une plus informatif de la page ciblée à ces exceptions près, par la capture de l'HttpAntiForgeryException.
et votre
/error/antiforgery
vue de leur dire Désolé vous avez essayé de présenter deux fois la même informationUne autre Idée est de connecter l'erreur et de renvoyer l'utilisateur à l'écran de connexion:
Créer un
HandleAntiforgeryTokenErrorAttribute
classe qui Remplace la OnException méthode.HandleAntiforgeryTokenErrorAttribute.cs:
Filtre Global:
Je voudrais aussi utiliser quelques outils pour enregistrer toutes vos informations de connexion est partie critique de votre application
NLog général de journalisation et d'e-mails sur des applications critiques exceptions (y compris les exceptions).
Elmah pour le filtrage et l'adresse électronique du web exceptions.
EDIT:
Aussi, vous pouvez regarder un plugin jQuery appelé SafeForm. Lien
EDIT:
J'ai vu beaucoup de débat sur ce sujet et sur tous les points de vue sur le sujet ont des points valides, Comment je regarde c'est (Prises de owasp.org)
Maintenant, j'ai aussi utiliser des adresses IP autorisées pour la connexion à attribuer une de mes applications avec 2 facteur d'autorisation si les utilisateurs changements d'adresse IP, donc si Cross-Site Request Forgery était en jeu, l'utilisateur ne serait pas correspondre à l'adresse IP et demande 2 facteur d'autorisation. presque comme la manière d'une sécurité routeur serait de travailler. mais si vous voulez le garder sur votre page de connexion, je ne vois pas un problème tant que vous avez de votre environnement de pages d'erreur configurer les gens ne vont pas se fâcher, car ils verront qu'ils ont fait quelque chose de mal.
En vérité La vraie réponse à ce problème est tout simplement que vous ne devriez pas utiliser un anti-faux jeton sur les formulaires de login! Il est inutile de "forge" étant un utilisateur sur un formulaire de connexion - ils ne sont pas encore connecté et utilisateurs anonymes jusqu'à ce qu'ils sont enregistrés dans! donc son utilisation pour l'utilisateur anonyme pour créer le Requestverification Jeton, anti-faux jeton doit être utilisé sur les formulaires une fois que l'utilisateur est connecté, comme des onglets sur le même navigateur et ordinateur aura rien de différent entre eux.
Pour être honnête, je suis un peu confus en ce moment, car il semble y avoir deux vues différentes sur le sujet, par exemple ici: security.stackexchange.com/questions/2120/... que j'ai trouvé assez vaste répondre par exemple, qui stipule que les faux jeton doit être utilisé sur le formulaire de connexion... d'autre part, il existe de nombreux autres posts qui disent le contraire... je vais attendre un peu plus pour d'autres idées possibles - mais si rien ne vient, je pense que je vais faire comme Vous le suggérez, et désactiver la validation de jeton de connexion 🙂
Ajout d'une nouvelle édition de mes pensées
aussi avez-vous essayé " [OutputCache(NoStore = true, Emplacement = OutputCacheLocation.None)]' votre login contrôleur. ce sera fait automatiquement une nouvelle demande de chargement de la page.
OriginalL'auteur pool pro