2013-05-28 112 views
3

我有一個需要用戶名和密碼的應用程序。當用戶點擊註銷按鈕時,它運行:從Web應用程序登錄某人的最佳方式是什麼?

private void LogOut() 
{ 
    Session["SessionName"] = null; 
    Session.Remove("SessionName"); 
    System.Web.Security.FormsAuthentication.SignOut(); 

    Response.Cookies.Remove("AuthCookie"); 
    HttpCookie c = new HttpCookie("AuthCookie"); 
    c.Expires = DateTime.Now.AddYears(-1); 
    Response.Cookies.Add(c); 

    Session.Clear(); 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(DateTime.Now.AddDays(-1)); 
    Response.Cache.SetNoStore(); 
    Response.Cache.SetNoServerCaching(); 

    Session.Abandon(); 

    Response.Redirect("~/user/login.aspx"); 
} 

問題是當我測試安全性時。當我轉到一個頁面來更改數據庫中的數據時,我可以使用Fiddler來「記錄」此請求。 在我註銷應用程序的之後,我仍然可以在Fiddler中重播此請求,就像我仍然登錄一樣。事實上,當我在代碼中放置中斷時,仍然可以看到所有Cookie和會話信息。只有在會話到期後(從超時),實際會話纔會消失。

爲什麼我在cookie過期並放棄會話後仍能看到這些信息?當用戶點擊註銷按鈕時,如何完全清除cookie和會話信息?

回答

4

根據MSDN(http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.aspx

調用SignOut方法僅刪除窗體身份驗證cookie。 Web服務器不存儲有效和過期的身份驗證票據以供以後比較。如果惡意用戶獲得有效的表單身份驗證cookie,這會使您的站點容易受到重播攻擊。

他們給出了三種方法來減輕這種風險。只有最後一種方法(使用永久存儲來自己跟蹤登錄狀態)將阻止實際用戶重播請求。第一種方法只是減少漏洞的時間窗口,第二種方法可以保護第三方的Cookie安全。

相關問題