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