2011-09-13 26 views
0

問題我有在MVC3應用程序的用戶登錄和註銷的問題。下面是我的註銷行爲的例子在我的用戶控制:與註銷後立即清除會話環境與MVC3

public ActionResult Logout() 
{ 
    FormsService.SignOut(); 
    Session.Clear(); 
    return RedirectToAction("index", "home"); 
} 

一旦用戶點擊註銷這個動作被調用時,它會清除會話信息,然後將用戶重定向到索引頁面。

在我的索引頁我所說的C#助手來顯示這樣一條消息:

@section links { @Html.HdrLinks("Home", "", Context.User) } 

這裏的助手的部分代碼:

System.Security.Principal.IPrincipal user 

if (user.Identity.IsAuthenticated) 
{ 
    return new MvcHtmlString("Welcome " + user.Identity.Name); 
} 

我的問題是,當指數頁面立即顯示後,它仍然顯示相同的會話信息。換句話說,它仍然顯示一個消息,如「歡迎約翰」。只有在刷新瀏覽器中的頁面後,才能正確看到會話中未設置用戶名。

有沒有人有什麼我可以做讓這個任何想法後,註銷或重定向則索引頁不會仍然認爲在用戶登錄?例如,除了RedirecToAction之外,還有一些可以幫助我執行的調用。

更新:

這似乎是當我在我的代碼更改,然後下面是我想要做什麼,當它到達顯示索引頁,然後它不告訴我,我仍然登錄然而我不知道爲什麼這個工作。

FormsService.SignOut(); 
Session.Clear(); 
Session.Abandon(); 
return new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Index" })); 
+2

http://stackoverflow.com/questions/412300/formsauthentication-signout-does-not-log-the-user-out檢查了這一點,可以幫助:) –

回答

0

這可能是緩存問題。你有沒有檢查過,當你的代碼要求瀏覽器進行重定向時,瀏覽器真的會向索引頁面發出新的請求?只需在索引操作中設置斷點並查看Session屬性即可。

+0

我檢查,它甚至不都調用操作方法。我猜這是因爲我的緩存設置如下:[的OutputCache(持續時間= 86400,的VaryByParam =「無」)] 公衆的ActionResult指數() – Rubin

+0

如果你把[的OutputCache]上的操作方法則是,該行動應根本不叫。事情是,緩存不會由用戶改變。這裏是它如何工作的http://stackoverflow.com/questions/3444245/using-asp-net-mvc-outputcache-while-varying-view-content-based-on-whether-user-is/3444468良好的簡要說明#3444468 [/鏈接]。但我不能解釋爲什麼你按F5後得到corrert頁面。 –

+0

請注意,當用戶登錄或退出時,您不會通過從緩存中刪除項來解決問題(http://stackoverflow.com/questions/7404261/can-i-force-mvc-to-get-a-new因爲_all用戶將共享相同的緩存視圖 –

0

這裏有一個Link來描述兩件事您需要更詳細地做另一張貼:

  1. 你需要清除會話,驗證Cookie和會話Cookie並返回餅乾響應。

  2. 您需要無效的客戶端緩存,以便用戶不能訪問通過點擊瀏覽器的後退按鈕緩存的網頁。

Link的細節....