2011-10-05 44 views
2

在ASP.NET MVC3控制器操作中,我想註銷用戶並返回401狀態碼。代碼很簡單:FormsAuthentication.SignOut在設置響應狀態代碼時失敗

public ActionResult Index() 
{ 
FormsAuthentication.SignOut(); 
HttpContext.Response.StatusCode = 401; 
return null; 
} 

當我設置狀態代碼時,用戶沒有註銷。爲什麼?如果我刪除狀態代碼行,用戶將註銷,但我不想返回200狀態。

這是怎麼回事?我如何達到理想的行爲?

這是我結束瞭解決問題:

if (Request.IsAjaxRequest()) 
{ 
    FormsAuthentication.SignOut(); 
    Response.StatusCode = 401; 
    Response.Flush(); 
    return null; 
} 
else 
{ 
    FormsAuthentication.SignOut(); 
    return new HttpUnauthorizedResult(); 
} 

回答

1
public ActionResult Index() 
{ 
    FormsAuthentication.SignOut(); 
    return new HttpUnauthorizedResult(); 
} 
+0

這適用於非AJAX請求,但對於AJAX請求無法正常工作。在原始帖子中查看我的解決方案。 – Mark

1

當您設置狀態碼401(未授權),瀏覽器沒有繼續保存您以前的設置與餅乾SignOut()調用。

要完全簽名,您必須明白您需要在瀏覽器中寫下Cookie(實際上是使用SignOut清除Cookie)。

也許一個想法是重定向到一個新頁面,並在這個新頁面中返回401的狀態碼。實際上,您可以使用中間頁面來製作SignOut和其他SignOut操作,然後重定向到給消息的最後一頁。

您也可以嘗試在StatusCode之前調用Response.Flush();,強制瀏覽器記下SignOut()的Cookie。

+0

你讓我在Response.Flush()的正確軌道上,但Response.Flush必須在狀態碼設置後調用。在原始文章中查看我的完整解決方案。 – Mark