2013-12-13 76 views
12

我剛開始擺弄OWIN/Katana和MVC.NET 5.0。默認的Visual Studio 2013 ASP.NET Web應用程序/ MVC模板具有的AccountController與退出()動作:爲什麼AuthenticationManager.SignOut()在更改響應時失敗?

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

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

Response.SetStatus(HttpStatusCode.SeeOther); 

... AuthenticationManager.SignOut()方法不再導致用戶註銷。這是爲什麼?

我嘗試了不同的方法來設置響應的http狀態碼,以及像位置一樣更改http頭,並始終使用相同的結果 - 執行LogOff()操作時用戶未註銷,如果我對這個反應進行了調整。我試過沒有使用RedirectToAction(它顯式地實現了302重定向 - 這是另一個故事),並沒有返回ActionResult,但這沒有什麼區別 - 這並不是我真正期望的。

使用Fiddler我可以告訴響應,因爲它看起來對瀏覽器看起來很好,沒有任何意外。

我也試過在工作中瀏覽OWIN中間件的源代碼,但這個架構對我來說還是不熟悉,而且我沒有找到可以在那裏理解的答案。我需要你的幫助來整理這個,所以提前謝謝你!

+0

當響應回到客戶端的提琴手時,你看到Set-Cookie刪除舊的c ookie? –

+0

不,我同意這是用戶仍然被視爲已登錄的技術原因。我沒有得到的是,爲什麼對SignOut()的調用不應該給出相同的結果,無論我是否更改狀態碼,刪除cookie和全部。我可以自己刪除cookie,或者如果我想要一個不同的行爲,我甚至可以實現我自己的OWIN中間件,但我不知道。我只想要另一個狀態代碼,這可能與RedirectToAction實現的行爲相矛盾,但爲什麼AuthenticationManager需要關心?我是否都在後面呢? –

+0

下一次請求後,用戶是否註銷? –

回答

7

原因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不能操縱的響應,以除去餅乾等

2

這適用於我以下的LogOut方法,你做的事情略有不同嗎?

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

謝謝你的回覆,郝。兩件事:首先,上面的代碼不會改變響應的狀態代碼(本身有點令人討厭)。它實際上仍然是一個302響應,返回(參見Fiddler);其次,是的,正如你從我的示例代碼中看到的那樣,我做了Response.SetStatus(HttpStatusCode.SeeOther); –

+0

你的代碼不工作的原因是RedirectToAction()將狀態碼再次改變爲302.我回去檢查Response.SetStatus()做什麼來防止這種情況發生,並且它實際上執行了一個Response.End() 。如果您在代碼中執行相同的操作,則會得到完全相同的結果 - 用戶未註銷。現在原因已經變得清晰了 - 當然,AuthenticationManager在響應「結束」之後無法執行註銷,刪除cookie和內容,對吧? :)這實際上是我的問題的答案,我猜...我不相信我忽略了這個... –

+0

記住你的密碼後試試這個..它無法正常工作(請參閱我的答案)解決此問題 – Jimmyt1988

相關問題