Asp.net-Mvc

為什麼我更改響應時 AuthenticationManager.SignOut() 失敗?

  • April 3, 2017

我剛開始擺弄 OWIN/Katana 和 MVC.NET 5.0。預設的 Visual Studio 2013 ASP.NET Web 應用程序/MVC 模板有一個帶有 LogOut() 操作的 AccountController:

public ActionResult LogOff() {
   AuthenticationManager.SignOut();
   return RedirectToAction("Index", "Home");
}

正如預期的那樣,這工作得很好。但是,當我更改響應狀態程式碼時,例如:

   Response.SetStatus(HttpStatusCode.SeeOther);

… AuthenticationManager.SignOut() 方法不再導致使用者註銷。這是為什麼?

我嘗試了不同的方法來設置響應的 http 狀態程式碼,以及更改諸如 Location 之類的 http 標頭,並且始終得到相同的結果 - 如果我進入緩和狀態,執行 LogOff() 操作時使用者不會註銷與回應。

我嘗試不使用 RedirectToAction(它顯式地實現了 302 重定向 - 那是另一回事),並且不返回 ActionResult,但這並沒有什麼區別 - 並不是我真的期望它。

使用 Fiddler,我可以看出瀏覽器顯示的響應看起來很好,沒有任何意外。

我還嘗試在工作中查看 OWIN 中間件的原始碼,但我對架構仍然不熟悉,並且我沒有找到可以掌握的答案。我需要你的幫助來解決這個問題,所以提前謝謝你!

失敗的原因AuthenticationManager.SignOut()Response.SetStatus(HttpStatusCode.SeeOther)內部結束了響應:

public static void SetStatus(this HttpResponseBase response, int httpStatusCode)
{
 response.StatusCode = httpStatusCode;
 response.End();
}

(見System.Web.WebPages.ResponseExtensions

在此之後,自然ResponseManager無法操縱響應以刪除 cookie 等。

使用以下 LogOut 方法對我來說效果很好,您做的事情是否略有不同?

   //
   // POST: /Account/LogOff
   [HttpPost]
   [ValidateAntiForgeryToken]
   public ActionResult LogOff()
   {
       Response.StatusCode = 303;
       AuthenticationManager.SignOut();
       return RedirectToAction("Index", "Home");
   }

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