Je crée une application d'une seule page et rencontre un problème avec les jetons anti-contrefaçon.
Je sais pourquoi le problème se produit, je ne sais tout simplement pas comment le résoudre.
J'obtiens l'erreur lorsque ce qui suit se produit:
- L'utilisateur non connecté charge une boîte de dialogue (avec un jeton anti-contrefaçon généré)
- L'utilisateur ferme la boîte de dialogue
- L'utilisateur se connecte
- L'utilisateur ouvre la même boîte de dialogue
- L'utilisateur soumet le formulaire dans la boîte de dialogue
Le jeton anti-falsification est destiné à l'utilisateur "" mais l'utilisateur actuel est "username"
La raison pour laquelle cela se produit est que mon application est à 100% sur une seule page, et lorsqu'un utilisateur se connecte avec succès via un message ajax à /Account/JsonLogin
, je change simplement les vues actuelles avec les "vues authentifiées" renvoyées par le serveur mais ne recharge pas le page.
Je sais que c'est la raison parce que si je recharge simplement la page entre les étapes 3 et 4, il n'y a pas d'erreur.
Il semble donc que @Html.AntiForgeryToken()
dans le formulaire chargé renvoie toujours un jeton pour l'ancien utilisateur jusqu'à ce que la page soit rechargée.
Comment puis-je changer @Html.AntiForgeryToken()
pour renvoyer un jeton pour le nouvel utilisateur authentifié?
J'injecte un nouveau GenericalPrincipal
avec une coutume IIdentity
à chaque Application_AuthenticateRequest
fois que le temps @Html.AntiForgeryToken()
est appelé HttpContext.Current.User.Identity
, en fait mon identité personnalisée avec la IsAuthenticated
propriété définie sur true et @Html.AntiForgeryToken
semble toujours restituer un jeton pour l'ancien utilisateur à moins que je ne recharge la page.
la source
Réponses:
Cela se produit parce que le jeton anti-contrefaçon intègre le nom d'utilisateur de l'utilisateur dans le cadre du jeton crypté pour une meilleure validation. Lorsque vous appelez pour la première fois,
@Html.AntiForgeryToken()
l'utilisateur n'est pas connecté, le jeton aura donc une chaîne vide pour le nom d'utilisateur, une fois que l'utilisateur se connectera, si vous ne remplacez pas le jeton anti-contrefaçon, il ne passera pas la validation car le jeton initial était pour utilisateur anonyme et nous avons maintenant un utilisateur authentifié avec un nom d'utilisateur connu.Vous avez plusieurs options pour résoudre ce problème:
Juste cette fois, laissez votre SPA faire un POST complet et lorsque la page se rechargera, il aura un jeton anti-contrefaçon avec le nom d'utilisateur mis à jour intégré.
Ayez une vue partielle avec juste
@Html.AntiForgeryToken()
et juste après la connexion, faites une autre demande AJAX et remplacez votre jeton anti-falsification existant par la réponse de la demande.Désactivez simplement le contrôle d'identité effectué par la validation anti-falsification. Ajoutez ce qui suit à votre Application_Start méthode:
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true
.la source
Pour corriger l'erreur, vous devez placer l'
OutputCache
annotation de données sur laActionResult
page Obtenir la connexion comme suit:la source
Cela arrive souvent avec mon application, alors j'ai décidé de chercher sur Google!
J'ai trouvé une explication simple sur cette erreur! L'utilisateur double-clique sur le bouton de connexion! Vous pouvez voir un autre utilisateur en parler sur le lien ci-dessous:
MVC 4 fourni le jeton anti-contrefaçon était destiné à l'utilisateur "" mais l'utilisateur actuel est "utilisateur"
J'espère que ça aide! =)
la source
J'ai eu le même problème, et ce sale hack l'a résolu, du moins jusqu'à ce que je puisse le résoudre de manière plus propre.
...
la source
Le message apparaît lorsque vous vous connectez alors que vous êtes déjà authentifié.
Cet assistant fait exactement la même chose que l'
[ValidateAntiForgeryToken]
attribut.Retirer le
[ValidateAntiForgeryToken]
attribut du contrôleur et placez cet assistant dans la méthode d'action.Ainsi, lorsque l'utilisateur est déjà authentifié, redirigez vers la page d'accueil ou sinon continuez avec la vérification du jeton anti-falsification valide après cette vérification.
la source
J'ai la même exception qui se produit la plupart du temps sur le serveur de production.
Pourquoi cela arrive-t-il?
Cela se produit lorsque l'utilisateur se connecte avec des informations d'identification valides et une fois connecté et redirigé vers une autre page, et après avoir appuyé sur le bouton de retour, la page de connexion s'affiche et il a à nouveau entré des informations d'identification valides que cette exception se produira.
Comment résoudre?
Ajoutez simplement cette ligne et travaillez parfaitement, sans erreur.
la source
J'ai eu un problème assez spécifique mais similaire dans le processus d'inscription. Une fois que l'utilisateur a cliqué sur le lien e-mail qui lui a été envoyé, il était connecté et envoyé directement à un écran de détails de compte pour fournir plus d'informations. Mon code était:
J'ai trouvé que la vue de retour ("AccountDetails") me donnait l'exception de jeton, je suppose parce que la fonction ConfirmEmail a été décorée avec AllowAnonymous mais la fonction AccountDetails avait ValidateAntiForgeryToken.
Changer le Return to Return RedirectToAction ("AccountDetails") a résolu le problème pour moi.
la source
Vous pouvez tester cela en mettant un point d'arrêt sur la première ligne de votre action Connexion (Obtenir). Avant d'ajouter la directive OutputCache, le point d'arrêt était atteint lors du premier chargement, mais après avoir cliqué sur le bouton de retour du navigateur, ce ne serait pas le cas. Après avoir ajouté la directive, vous devriez vous retrouver avec le point d'arrêt à chaque fois, donc l'AntiForgeryToken sera le corect, pas le vide.
la source
J'ai eu le même problème avec une application ASP.NET MVC Core d'une seule page. Je l'ai résolu en définissant
HttpContext.User
toutes les actions du contrôleur qui modifient les revendications d'identité actuelles (puisque MVC ne le fait que pour les demandes ultérieures, comme indiqué ici ). J'ai utilisé un filtre de résultat au lieu d'un middleware pour ajouter les cookies anti-contrefaçon à mes réponses, ce qui m'a assuré qu'ils n'étaient générés qu'après le retour de l'action MVC.Contrôleur (NB. Je gère les utilisateurs avec ASP.NET Core Identity):
Filtre de résultat pour ajouter des cookies anti-contrefaçon:
Extrait de Startup.cs:
la source
A un problème avec la validation anti-falsification des jetons dans la boutique en ligne: les utilisateurs ouvrent de nombreux onglets (avec des marchandises) et après s'être connectés sur l'un essaient de se connecter sur un autre et ont obtenu une telle AntiForgeryException. Donc, AntiForgeryConfig.SuppressIdentityHeuristicChecks = true n'a pas aidé pour moi, alors j'ai utilisé un tel hackfix laid, peut-être que cela sera utile pour quelqu'un:
Je pense que ce sera génial si des options de génération de jetons anti-falsification peuvent être définies, pour exclure le nom d'utilisateur ou quelque chose comme ça.
la source