2010-01-07 8 views
1

由於各種原因,我厭倦了ASP.NET會話狀態,我試圖自己做(單獨的問題即將到來,爲什麼我感到厭倦,是否可行,自己做,但現在讓我們假定它是)。拋開安全問題,跟蹤會話似乎只涉及使用guid存儲cookie,並將該guid與數據庫中的小型「會話」表相關聯,該數據庫在guid上鍵入幷包含少量的字段來跟蹤超時並鏈接到用戶表中的主鍵,用於那些鏈接到註冊用戶的會話。ASP.NET(或任何Web框架)如何實現持久會話狀態?

但是我堅持使用cookie的細節,在用戶的瀏覽器沒有設置爲接受cookie的情況下。在我看來,每次用戶訪問啓用會話狀態的任何頁面時,ASP.NET都必須確定瀏覽器是否支持cookie。如果已經有與請求一起發送的會話cookie,顯然它知道cookie被接受。

如果不是,它似乎需要檢查,據我瞭解,它涉及嘗試寫入cookie並重定向到試圖讀取cookie的頁面。如此看來,當用餅乾用戶關閉訪問一個網站的幾個頁面,那ASP.NET

(一)必須爲每一頁做往返測試的用戶訪問,或

( b)必須假設瀏覽器接受cookie並在每個頁面上爲用戶創建一個帶有(臨時)會話ID的記錄 - 並且如果會話狀態應該是持久性的,那麼似乎必須將該初始會話ID寫入數據庫在每個頁面上。

但是(a)聽起來很瘋狂,而且(b)聽起來也很瘋狂,因爲我們會爲所有這些單頁會話快速累積會話ID。所以我認爲必須有一些其他的技巧/啓發式,用於知道何時進行往返測試和/或何時爲會話創建記錄。

我錯了嗎困惑?我想說的是,在ASP.NET的可插入會話狀態系統中實現一個自定義的存儲解決方案,我說的是完全跳過ASP.NET的會話狀態系統,我的問題是一個更詳細的版本這個之一:Implementing own Session Management in ASP.NET。)

+0

閱讀了幾次之後,我想我知道你在試着說些什麼。 (a)連同(b)的確聽起來很瘋狂。希望有人能啓發我們。 – 2010-01-07 08:09:36

回答

1

那麼,cookies是Web認證的標準機制。爲什麼你不想使用它們,你有什麼理由嗎?你確定你不想在沒有任何問題的情況下發明問題嗎?

我認識的最嚴肅的網站要求瀏覽器接受cookie以便用戶進行身份驗證。假設每個現代瀏覽器都支持它們是安全的。

你應該閱讀關於cookieless ASP.NET的一篇有趣的文章。

編輯:

@ o.k.w:默認情況下,會話狀態是ASP.NET保持在過程(閱讀:在內存中)。除非通過配置明確告知將會話存儲在數據庫中(SQL Server支持開箱即用),否則這不會導致數據庫命中。過時的會話狀態將從進程內存儲中清除。不幸的是,對於默認的ASP.NET設置,每個無cookie請求都會導致創建新的會話。

下面是可用會話存儲選項的詳細比較:http://msdn.microsoft.com/en-us/library/ms178586.aspx

+0

@Mercin,我不這是OP的關注。其中一個問題是,如果請求不包含已知會話(或會話ID),Web服務器是否創建新會話?如果是這樣,如果客戶端不支持cookie,這將'浪費'服務器資源。那麼服務器是否會知道它不需要爲這個特定的無Cookie客戶端「關心」會話cookie?如果是這樣,怎麼樣? – 2010-01-07 08:41:02

+0

@Mercin,謝謝你的解答我的觀點,非常感謝:) +1 – 2010-01-07 09:15:30

+0

感謝這些信息,但我不認爲它回答了我的問題。 – 2010-01-07 16:44:06

1

會話行爲通過web.config中的sessionState元素進行設置。在sessionState元素中,HttpCookieMode可以設置爲UseUri, UseCookies, AutoDetect, UseDeviceProfile之一。

UseUri和UseCookies明確告訴ASP.NET如何處理存儲會話標識符。如果使用UseDeviceProfile,則行爲由用戶代理是否支持Cookie(而不是它們是否已啓用)確定。

AutoDetect是您感興趣的有趣案例。ASP.NET如何處理自動檢測在Understand How the ASP.NET Cookieless Feature Works中進行了說明。在那篇文章中,你會看到他們有5個不同的檢查。正如你所提到的,其中一項檢查是設置一個cookie並進行重定向以查看cookie是否存在。如果cookie存在,那麼瀏覽器支持cookie並設置sessionID cookie。但是,這並不是每個請求都完成的,因爲在重定向之前他們做的另一個檢查是檢查是否存在任何cookie。由於在初始set-cookie和重定向之後,sessionID cookie將被設置,因此cookie的存在讓ASP.NET知道支持cookie並且不需要進一步的set-cookie和重定向。

+0

是的,我認爲該鏈接中的算法主要是我原來的問題的答案。關鍵似乎是它避免了在每個頁面上執行往返檢查,因爲在第一次往返失敗後它會修改URL,並且從那時起修改的URL就是不支持cookie的標誌,不需要再進行檢查。但是,似乎仍然有一個基本的尚未解決的問題。如果您將模式設置爲UseCookies(而不是AutoDetect),那麼是否在每個頁面上執行往返(因爲不允許(?)修改URL)? – 2010-01-07 17:02:29