2014-09-05 100 views
2

我遇到了asp.net安全問題。在註銷時,我想確保會話被銷燬,以便有人不能採用相同的sessionid和auth cookie並編輯那裏的cookie,並且服務器仍然響應會話。Asp.net在清除cookies,session和formsauth後退出服務器上的會話

FormsAuthentication.SignOut(); 
Session.Abandon(); 
Session.RemoveAll(); 
Session.Clear(); 

我也試着寫了新的cookies到客戶端

// clear authentication cookie 
HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, ""); 
cookie1.Expires = DateTime.Now.AddYears(-1); 
Response.Cookies.Add(cookie1); 

HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", ""); 
cookie2.Expires = DateTime.Now.AddYears(-1); 
Response.Cookies.Add(cookie2); 

我一直在使用以不同的順序,仍然沒有骰子以下嘗試。如果我使用原始的sessionid和Auth cookie,我仍然可以登錄。我希望服務器在註銷時完全忘記該sessionid。這甚至有可能嗎?

回答

1

服務器確實忘記了與該會話相關的所有內容,因此在使用Session.Clear()時使該會話ID無效。

由於msdn documentation說:

將刪除會話狀態集合所有鍵和值

所以,即使有人使用相同的會話ID就沒有重視它在信息服務器。

[編輯]

正如埃裏克Funkenbusch點,我的解決辦法只有當你存儲在會話(顯然)認證信息工作。如果您的身份驗證系統具有特定的Cookie,則這不起作用。

+0

是的,但必須有對有效會話數和無效的會話進行比較的服務器上,否則任何人都可以告訴服務器它們被登錄爲張三 – 2014-09-06 00:10:38

+0

沒有,因爲所有的信息有些還挺授權它標識你爲Joe Smith被刪除'Session.Clear()' – Joanvo 2014-09-06 08:43:45

+0

@Joanvo - Session與認證無關,這就是你標識爲Joe Smith的標識。 – 2014-09-12 21:08:45

4

服務器端無法永久清除認證會話。您可以清除cookie,但如果有人制作了它的副本,他們可以簡單地重新使用它,他們將訪問該網站。驗證Cookie是加密的驗證票據,這意味着該站點將對它們進行解密並驗證它們是否正確解密並且沒有過期。如果是這種情況,那麼auth cookie是有效的。

不幸的是,沒有辦法解決這個問題,短期內沒有使用過期的短期價值和更新滑動窗口上的到期日期,但這意味着如果用戶閒置幾分鐘,他們將不得不再次登錄。

儘管您可以生成唯一的ID並將其存儲在故障單中,然後將該ID存儲在服務器上,並在每次請求上比較以添加附加層,但沒有與認證故障單關聯的「會話ID」的安全。當你想殺掉那個cookie時,你可以清除服務器上的任何ID,並且它們不能再登錄,即使票證是有效的。

另一方面,會話cookie確實擁有id,並與映射到該ID的內部存儲相關聯,所以當您清除會話時,您還會刪除存儲......如果您重複使用該cookie,則只會返回null數據。

您還可以通過始終使用加密的Cookie並使用HTTPS來添加更多安全性。 HTTPS不會以可以獲取和重複使用的方式存儲Cookie(它們使用SSL會話進行加密,並且一旦該SSL會話完成,Cookie將無法使用)。

另一種選擇是使用非持久性cookie,它不會存儲在服務器上。儘管他們仍然可以在中間攻擊中被人抓獲。

要理解爲什麼沒有辦法解決問題,您必須瞭解身份驗證Cookie旨在長期存在並存儲在用戶計算機上。當您回來時,它可能是不同的會話。因此,知道用戶是否經過身份驗證的唯一方法是簡單地依靠是否可以使用服務器證書(通常爲機器密鑰)對cookie進行解密。這意味着會話和身份驗證票證之間沒有任何聯繫。

0

如果指向瀏覽器的後退按鈕,我用波紋管代碼(VB,但你可以把它轉換):

的web.config:

<sessionState timeout="20" regenerateExpiredSessionId="true"/> 

avsessexp.js(自動刷新頁面,如果在15分鐘後無效):

var BeatTimer; 
    function StartCheck() { 
     if (BeatTimer == null) { 
      BeatTimer = setInterval("CheckBeat()", 900000); 
     } 
    } 

    function CheckBeat() { 
     PageMethods.PokePage(); 
    } 

和致電StartCheck有趣ction在每一頁(<body onload="StarCheck();">

在每一頁的標題,我把:

<meta http-equiv="pragma" content="no-cache" /> 
<meta http-equiv="cache-control" content="no-cache, no-store, max-age=0, must-revalidate" /> 
<meta http-equiv="expires" content="0" /> 

的Module1.vb

Public Sub CheckSession() 
     With HttpContext.Current 
      .Response.Cache.SetExpires(DateTime.UtcNow.AddSeconds(-1)) 
      .Response.Cache.SetCacheability(HttpCacheability.NoCache) 
      .Response.Cache.SetNoStore() 
      If .Session.IsNewSession = True Then LogOut() 
      'there You can put some code checking is user logged, ... 
     End With 
    End Sub 

    Public Sub LogOut() 
     With HttpContext.Current 
      .Session.RemoveAll() 
      .Session.Clear() 
      .Session.Abandon() 
      Try 
       .Response.Cookies.Add(New System.Web.HttpCookie("ASP.NET_SessionId", "")) 
      Catch ex As Exception 

      End Try 
      .Response.Redirect("Default.aspx") 
     End With 
    End Sub 

,並在每個頁面(代碼隱藏):

<System.Web.Services.WebMethod(EnableSession:=True)> Public Shared Sub PokePage() 
     CheckSession() 
    End Sub 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     If Not IsPostBack Then CheckSession() 
    End Sub 

如果您嘗試單擊瀏覽器後退按鈕af ter註銷,CheckUser將防止返回到prev頁面,並始終將用戶重定向到登錄頁面。

它在每個頁面/母版頁<asp:ScriptManager runat="server" id="sm1" EnablePageMethods="True"><asp:ScriptManager>

附註:上使用是非常重要的對我弱的英語感到抱歉。

0

的不是編程的方式,以確保所有的會話/ cookie被消滅在服務器端,是添加(如果不存在)或變化(如果存在的話)的機器在關鍵應用程序的web.config

它可以是通過選擇一個應用程序通過IIS管理器完成,並在ASP.NET部分選擇「機器密鑰」,取消所有複選框並點擊生成密鑰,然後點擊應用

請注意,這不是一個用戶,它會踢出所有用戶。

Machine Key - Generate

+0

是的,我正在尋找如何清除用戶內存時,他們登錄系統 – 2016-10-03 19:35:57

+1

我發佈了這個答案,因爲我們希望強制每個人都重新登錄,我們發現的所有解決方案都是關於修改Cookie,這樣做不工作,所以也許有人會從我的回答中受益,但我不知道在哪裏準確回答。 Q的標題似乎對我的回答最爲中立/相關。謝謝! – 2016-10-04 16:41:26