web-dev-qa-db-fra.com

Le serveur ne peut pas ajouter d'en-tête après l'envoi des en-têtes HTTP Exception à @ Html.AntiForgery

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?

26
Bilal Ahmed

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 .

63
Joel R Michaliszen

J'obtenais la même erreur avec Response.Redirect(returnUrl). Après être passé à Response.Redirect(returnUrl, false) a résolu le problème.

9
user3208246