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.
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.
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:
Html.AntiForgeryToken - Équilibrer la sécurité et la convivialité
J'ai eu le même problème quand
J'ai trouvé que cela ne se produisait que dans IE et je l'ai corrigé en faisant quelques choses
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();
}