Подтвердить что ты не робот

Сервер не может добавить заголовок После отправки заголовков 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()

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

Сервер не может добавить заголовок после отправки заголовков HTTP.

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Response.Redirect(returnUrl);

в

return Redirect(returnUrl);

Заметка

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

Ответ 2

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

Ответ 3

Решил ту же проблему и решил, что заголовки уже записаны перед рендерингом токена AntiForgery.

@using (Html.BeginForm())
{
     if (!Response.HeadersWritten) { Html.AntiForgeryToken(); }

...