Сервер не может добавить заголовок После того, как заголовки HTTP были отправлены исключение в @Html.AntiForgery

Я разрабатываю asp.net приложение mvc 5, в котором я пытался перенаправить на ReturnUrl, применив код ниже:

[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();
}

приведенный выше код работает нормально, но проблема в том, что когда я публикую форму входа в систему, это дает мне исключение, с которым я никогда не сталкивался раньше, и у меня возникают трудности с разрешением исключения, которое генерируется в представлении в Login.cshtml, в строке:

@Html.AntiForgeryToken()

и исключение, которое он бросает :

Server cannot append header after HTTP headers have been sent.

Я много исследовал, но я не могу прийти к выводу. Мое приложение отлично работает, когда я удаляю @Html.Линия AntiForgeryToken (), но я не хочу этого делать, я хочу, чтобы мое приложение оставалось защищенным межсайтовым запросом.

может кто-нибудь, пожалуйста, помогите мне, как мне избавиться от этого исключения?

2 ответов


, когда Response.Redirect(anyUrl) код состояния установлен в 302, и заголовок будет добавлен к ответу:

HTTP 1.0 302 Object Moved 
Location: http://anyurl.com

и когда ViewResult выполняется и razor визуализирует представление Html.AntiForgeryToken() будет вызван, поэтому помощник пытается добавить заголовок X-Frame-Options и печенье в ответ, это является причиной исключения.

но не волнуйтесь, вы можете подавить добавлением X-Frame-Options заголовок, просто поместите это AntiForgeryConfig.SuppressXFrameOptionsHeader = true; на Application_start.

но я предлагаю вам изменить это:

Response.Redirect(returnUrl);

to

return Redirect(returnUrl);

Примечание

так как был открыт .NET-код, вы можете увидеть, как AntiForgeryToken см. здесь AntiForgeryWorker


Я получаю ту же ошибку с Response.Redirect(returnUrl). После изменения на Response.Redirect(returnUrl, false) Исправлена проблема.