Asp.net-Mvc-5

發送 HTTP 標頭後伺服器無法附加標頭 @Html.AntiForgery 出現異常

  • December 14, 2015

我正在開發一個 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() 行時,我的應用程序工作正常,但我不想這樣做,我希望我的應用程序保持跨站點請求保護。

誰能幫幫我,我該如何擺脫這個異常?

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

引用自:https://stackoverflow.com/questions/34270192