2010-07-20 59 views
3

我正在創建一個HttpCookie,只設置名稱和值而不是expires屬性,然後將其添加到響應中。夠簡單。按預期創建Cookie(但未保留)。問題是當會話由於某種原因而改變時(比如網站被重建,或者我在調試時重建了我的應用程序),那麼Cookie仍然存在。我希望cookie只對其創建的原始會話有效。會話更改或無效時不會刪除HttpCookie

根據MSDN的說法:「如果您沒有爲cookie指定過期限制,則cookie不會持久保存到客戶端計算機,並在用戶會話過期時過期。」

我想我不確切知道「會話過期」包含的內容。我認爲會話過期20分鐘後cookie會被刪除。但是,如果由於許多原因,創建的會話不再存在,Cookie是否會被刪除?我看到cookie被刪除的唯一時間是當用戶關閉所有瀏覽器窗口並打開一個新窗口時。

如果這都是真的,我可能必須將原始會話ID(「ASP.NET_SessionId」)存儲在cookie中,然後根據當前會話ID檢查它是否不同,然後刪除cookie或創建一個新的。

下面的代碼(我的餅乾和一個在MSDN例子之間唯一的區別就是我存儲多個值在Cookie):

private void SaveValuesToCookie(string[] names, string[] values) 
{ 
    HttpCookie cookie = new HttpCookie("MyCookie"); 

    for (int i = 0; i < names.Length; i++) 
    { 
     string name = names[i]; 
     cookie.Values[name] = values[i]; 
    } 
    Response.Cookies.Add(cookie); 
} 

private string GetValueFromCookie(string name) 
{ 
    HttpCookie cookie = Request.Cookies["MyCookie"]; 
    if (cookie == null) 
     return null; 

    return cookie.Values[name]; 
} 

回答

3

我見過的唯一一次當用戶關閉所有 瀏覽器窗口並打開一個新窗口時,cookie被取消 被刪除。

而這正是MSDN的意思,當它說cookie會在會話過期時被刪除。不幸的是,我認爲這在瀏覽器上並不一致,所以對任何人都沒有多大用處。

您應該始終在Cookies上設置到期日期。

如果這都是真的,我可能要 存儲原始會話ID (「ASP.NET_SessionId」)在Cookie,然後 檢查它與當前 會話ID,如果他們是不同的,然後 刪除該cookie或創建一個新的。

我討厭這樣說,但這不會幫助你。 .NET Framework喜歡回收會話ID,所以你不能保證它會有所不同。

壞消息,我建議你從架構的角度重新考慮你想要做什麼。

重新啓動應用程序是完全在服務器上發生的事情; cookie是完全在客戶端發生的事情。雖然客戶端將與服務器通信,但它純粹是請求/響應關係,服務器無法將諸如應用程序重啓等事件傳遞給瀏覽器。

如果你想在某個地方存儲一個只對服務器會話有效的值,爲什麼不把它存儲在會話中而不是Cookie中?

+0

我不想將它存儲在會話中的原因(我原本是這樣做的)是我需要一個安全的cookie,只有在使用https時纔會通過。我不想保護整個會話,因爲這意味着整個網站必須使用https。所以在我的示例代碼中,我在SaveValuesToCookie()中省略了這部分:cookie.Secure = true; – 2010-07-20 20:01:32

+1

如果你在會話中存儲的東西,它們不會傳遞給客戶端,所以它們儘可能安全。他們只活在服務器上的內存中。客戶端只會將會話ID視爲一個cookie,並將其發送回服務器,並且.NET框架將根據該數據檢索會話數據。如果會話被終止,數據就會丟失,這通常是一種風險,但如果您想在會話/應用程序重新啓動時使數據失效,則不會。 – pdr 2010-07-20 23:32:35

0

我意識到這一切,但它不夠安全,我們的客戶需要。會話仍然可能被欺騙或注入。請參閱:http://msdn.microsoft.com/en-us/magazine/cc163730.aspx#S9

看起來我要創建一個與會話分開的過期安全Cookie,並在我可以(即當用戶訪問某些頁面時)刷新過期日期。

+0

如果會話cookie可能被欺騙,那麼您的自定義cookie也可能被欺騙。唯一的辦法就是阻止數據在未加密的線路上傳輸。使用SSL。這將保護您的Cookie和標準會話ID,從而使您的cookie變得多餘。 – pdr 2010-07-22 01:01:29

+0

是的,這就是我所說的「安全cookie」。在Cookie上設置Secure屬性,以便僅在使用https時傳輸。 – 2010-07-22 23:21:14

+0

順便說一句,不知道如何將帖子標記爲已註冊的回覆。謝謝您的幫助。 – 2010-07-22 23:22:02