2012-08-23 65 views
2

概述: 我創建了一個系統,有客戶區和管理員區。這兩個區域都有不同的登錄頁面。用戶可以登錄爲用戶A在管理區域同時登錄爲用戶B在客戶區域。放棄會議沒有清除所有

當從任一客戶或管理區域的用戶註銷,Session.Abandon()被調用,它消除了在客戶與管理區域會議,我不希望發生

問題:我可以在註銷時放棄會話而不影響其他區域的會話? (即:當我從客戶區域退出,我應該留登錄在管理區)

更新:我知道Session.Clear()可以解決類似的問題,但我怕了安全風險可能強加。

+2

實現這些是兩個單獨的網站會更簡單嗎? –

+2

不!放棄會話導致清除所有會話。 您可以使用session.remove(「Keyname」)刪除特定會話 – SMK

+0

您是否在兩個區域使用相同的會話?嘗試使用兩個不同的會話 – Sora

回答

0

問題的核心是,通常爲一個 asp網絡應用有每個物理用戶的瀏覽器只有一個會話(*)。如果沒有對站點/框架/服務器代碼結構進行一些真正嚴肅的修改,則無法創建和維護幾個並行的sesisons。即使由Pages和Controls提供的「.Session」散列表總是顯示相同的鍵/值。

Web應用程序的某些部分可能使用不同的鍵,從而模擬不相交的「層」或「模塊」但還是這僅僅是一個存儲..

因此,如果你調用會話放棄,你失去了一切 - 因爲它WA只有一個會話那裏..

遵守前面做的唯一一件事就是手工選擇清晰正確的條目,像Rolice在這裏並行回答:)

(*)實際上,當你做會話放棄時,你不是刪除/銷燬會話。仍然只有一個會話。它只是忘記了所有的數據,現在它是「空的」=所以,就像新的一樣。好吧,它可能會刪除舊的餅乾,我不記得,但它們將在下一頁渲染時立即用新的密鑰重新創建,所以......非常直接。

+0

如果我選擇性地刪除會話而不是放棄會話,是否存在潛在的安全風險? – xar

+0

那麼,你忘記清除/刪除的所有內容都會保留在那裏,直到會話結束。因此,風險僅取決於您在會話中保留的內容以及您是否允許在您的網站上添加和運行第三方代碼模塊。 Session是一個也是全球性的,因此當前顯示的網頁上的任何模塊都可以訪問它。這同樣適用於ViewState和ControlState以及Web引擎中存在的其他狀態包。但是,請注意,會話保留在服務器上,只有會話密鑰位於cookie中 - 因此只有SERVER端代碼模塊才適用。你的服務器。谷歌統計等不會看到它。 – quetzalcoatl

+0

但這適用於會話,**不適用於ViewState/ControlState和類似的狀態包。它們被序列化並嵌入頁面的HTML代碼中作爲隱藏的表單字段 - 因此它們完全不安全,並且任何可以讀取HTML的代碼都可能讀取放入其中的數據。這就是它被稱爲ViewState的原因 - 「與視圖一起保存的數據」。如果你想知道你的國家行爲如何,你必須自己檢查一下,或者在你的框架文檔中查看。 ViewState/ControlState存在於基本ASP.NET中,並且可能在MVC中以不同的方式命名。 – quetzalcoatl

1

編寫您的函數,檢查會話的客戶ID是否> 0,用戶名不爲空,IP等於遠程ADDR。

在會話中存儲customer_id,customer_username和IP(爲了安全)並僅清除它們。 當您調用您的功能時,它將返回該用戶未作爲客戶簽名。

同樣適用於管理員。

沒有必要銷燬(放棄)會話,保持活動狀態並存儲其他信息。

public bool IsLoggedIn() 
{ 
    // You will have to check for the keys, if they are present in the Session container, first. 

    if(!Session.Containts("customer_id") 
      || !Session.Contains("customer_username") 
      || !Session.Contains("customer_ip")) 
     return false; 

    return Session["customer_id"] > 0 
     && String.IsNullOrEmpty(Session["customer_username"]) 
     && Session["customer_ip"] = Request.ServerVariables("REMOTE_ADDR") 
} 

public void LogOut() 
{ 
    Session.Remove("customer_id"); 
    Session.Remove("customer_username"); 
    Session.Remove("customer_ip"); 
}