Je développe une application asp.net mvc 5 dans laquelle j'essayais de rediriger vers ReturnUrl en appliquant le code ci-dessous:
[HttpPost]
[AllowAnonymous]
public ActionResult Login(UserLogin model, string returnUrl)
{
if (ModelState.IsValid)
{
string EncryptedPassword = GetMD5(model.Password);
if (DataAccess.DAL.UserIsValid(model.Username, EncryptedPassword))
{
FormsAuthentication.SetAuthCookie(model.Username, true);
if (String.IsNullOrEmpty(returnUrl))
{
return RedirectToAction("Index", "Home");
}
else
{
Response.Redirect(returnUrl);
}
}
else
{
ModelState.AddModelError("", "Invalid Username or Password");
}
}
return View();
}
Le code ci-dessus fonctionne correctement, mais le problème est que lorsque je publie le formulaire de connexion, il me donne une exception que je n'ai jamais rencontrée auparavant et j'ai des difficultés à résoudre l'exception qui se produit dans la vue dans Login.cshtml , À la ligne :
@Html.AntiForgeryToken()
Et l'exception qu'il jette:
Le serveur ne peut pas ajouter d'en-tête après l'envoi des en-têtes HTTP.
J'ai fait beaucoup de recherches mais je n'arrive pas à conclure. Mon application fonctionne correctement lorsque je supprime la ligne @ Html.AntiForgeryToken (), mais je ne veux pas le faire, je veux que mon application reste protégée contre les demandes intersites.
Quelqu'un peut-il m'aider, comment puis-je me débarrasser de cette exception?
Lorsque Response.Redirect(anyUrl)
le code d'état est défini sur 302 et l'en-tête sera ajouté à la réponse:
HTTP 1.0 302 Object Moved
Location: http://anyurl.com
Et lorsque ViewResult
est exécuté et que le rasoir rend la vue que la Html.AntiForgeryToken()
appellera, donc l'assistant essaie d'ajouter l'en-tête X-Frame-Options
Et quelques cookies à la réponse, c'est le cause de l'exception.
Mais ne vous inquiétez pas, vous pouvez supprimer l'ajout de l'en-tête X-Frame-Options
, Il suffit de mettre ce AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
Dans le Application_start
.
Mais je vous suggère de changer cela:
Response.Redirect(returnUrl);
à
return Redirect(returnUrl);
Remarque
Depuis que le code .NET a été ouvert, vous pouvez voir comment fonctionne le AntiForgeryToken
, voir ici AntiForgeryWorker .
J'obtenais la même erreur avec Response.Redirect(returnUrl)
. Après être passé à Response.Redirect(returnUrl, false)
a résolu le problème.