Сервер не может добавить заголовок После отправки заголовков 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(), но я не хочу этого делать, я хочу, чтобы мое приложение оставалось защищенным межсайтовым запросом.
Может кто-нибудь, пожалуйста, помогите мне, как мне избавиться от этого исключения?
Ответы
Ответ 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(); }
...