Asp.net-Mvc
為什麼我更改響應時 AuthenticationManager.SignOut() 失敗?
我剛開始擺弄 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"); }