2015-12-14 6 views
13

Я разработки ASP.NET MVC 5 приложение, в котором я пытался перенаправить к ReturnUrl, применяя код ниже:сервера Невозможно добавить заголовок HTTP После заголовки были отправлены Exception на @ Html.AntiForgery

[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, At Line:

@Html.AntiForgeryToken() 

И Excepti на то, что он выбрасывает:

Server cannot append header after HTTP headers have been sent. 

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

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

+1

Показать код, в котором вы используете строку @ Html.AntiForgeryToken() – ojf

+0

Является ли ваш @ Html.AntiForgeryToken() 'в вашей форме на вашем представлении? –

+0

@PedroBenevides Да, он находится в форме Beg..Sorry Для позднего ответа. –

ответ

42

Когда 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

+0

О, да, брат, Большое вам спасибо. Я все еще застрял на этом. Ты прибил его, Серьезно :) Отмечено как ответ :) –

+0

@BilalAhmed Так было полезно? Пожалуйста, не забудьте также перевернуть xD –

+0

Да, абсолютно, это было. Я попытался проголосовать, но они сказали мне подождать, пока я не получу репутацию до 15: p –

1

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