2011-08-01 51 views
0

我知道這已被問及以前已回答很多次,相信我已經通過所有帖子尋找解決方案,然後再詢問ASP.Net註銷不按預期工作

如果用戶登錄頁面,獲取URL副本,註銷然後將URL粘貼回瀏覽器,他們可以在瀏覽器重定向到登錄之前非常簡單地訪問他們以前訪問過的頁面頁面再次。在這個簡短的窗口中,如果鼠標速度足夠快,並且可以點擊按鈕或其他控件,它們會以某種方式重新登錄到網站,而不會問任何問題。

我已經嘗試從主題上的另一個線程包括以下代碼建議到每個Page_Load事件,以避免緩存但沒有成功。從logout.aspx

private void ExpirePageCache() 
    { 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.Cache.SetExpires(DateTime.Now - new TimeSpan(1, 0, 0)); 
     Response.Cache.SetLastModified(DateTime.Now); 
     Response.Cache.SetAllowResponseInBrowserHistory(false); 
    } 

代碼如下:

protected void Page_Load(object sender, EventArgs e) 
    { 
     FormsAuthentication.SignOut(); 
     HttpContext.Current.Session.Clear(); 
     HttpContext.Current.Session.Abandon(); 
     Response.Redirect("~/Account/Login.aspx"); 
    } 

我應該使用Server.Transfer()代替Response.Redirect()

我讀過的地方,我不允許以編程方式清除瀏覽器的歷史,所以有點卡住了。任何人都有任何線索嗎?

回答

0

是的,那行代碼已經包含在logout.aspx頁面的Page_Load事件中。這是執行的第一行代碼...

0

我懷疑還有其他事情發生。

當您調用response.redirect時,生成的任何頁面內容都不會發送到客戶端。 ASP使用緩衝,所以當你產生你的頁面時,它會被緩衝,直到你到達最終位置,然後緩衝區被髮送到客戶端。這允許您直到最後一刻進行更改,例如發送重定向響應。所以這不是你的問題。

您是使用輸出緩存還是將窗體身份驗證票證設置爲持久性?如果瀏覽器擁有內容的緩存副本,它將顯示出來,而不是命中服務器(因爲緩存是專門設計的)。儘管你點擊服務器的那一刻,如果cookie無效,那麼服務器應該將你重定向到某個地方以獲得一張新票。如果它沒有這樣做,那麼它就會找到一張有效的票。

您可以使用Fiddler來監視流量。您可以通過使用Fiddler手動發送請求並刪除票證Cookie來模擬新的瀏覽器會話。

Simon