2010-11-17 166 views
2

我想爲我正在建設的ASP.NET MVC網站實現「記住我」登錄功能。我試圖用這種方法http://jaspan.com/improved_persistent_login_cookie_best_practice(見'米勒的設計'靠近頂部),並在一定程度上工作。「記住我」登錄網站 - 問題與不同的瀏覽器/電腦

因此,工作流程是:

  1. 在用戶登錄併發出加密的安全隨機字符串+他們的數據庫ID作爲永久性的Cookie(持續約30天)。安全字符串存儲在他們的用戶帳戶記錄旁邊的數據庫中。
  2. 用戶後來回到瀏覽器顯示登錄cookie的站點,在數據庫中查找ID和安全密鑰,如果找到匹配項,用戶將自動進行身份驗證。
  3. 一旦通過身份驗證,就會生成一個新的安全密鑰,並存儲在數據庫中併發布新的cookie。

我有這個工作正常,但是,如果用戶從多個瀏覽器或計算機登錄它不工作得很好。顯然,不同的瀏覽器將最終存儲在cookie中的不同安全密鑰,因此工作流程變爲:

  1. 用戶從瀏覽器時,登錄時,會發出安全密鑰的cookie,密鑰存儲在數據庫中。
  2. 用戶從瀏覽器B登錄,發出與cookie不同的安全密鑰。密鑰也存儲在數據庫中,但會覆蓋從瀏覽器A生成的密鑰。
  3. 用戶再次從瀏覽器A訪問網站,瀏覽器顯示從步驟1發出的cookie,但它不再匹配,因爲在步驟2中更換了安全密鑰。用戶必須重新登錄。另一種新的密鑰生成,並覆蓋發給瀏覽器B.
  4. 用戶可以從瀏覽器中乙又來,密鑰不匹配訪問的關鍵,必須再次登錄等等,等等

我該如何解決這個問題?我是否需要在數據庫中存儲和維護多個密鑰?我甚至會以正確的方式去做這件事嗎?我注意到StackOverflow似乎可以管理這一點,並記住我從不同的瀏覽器和計算機。

回答

1

通過閱讀您鏈接的文章,在我看來,Miller的設計是將隨機字符串和用戶名作爲一對存儲在與用戶表不同的表中。通過使用隨機字符串作爲索引,可以從同一個用戶名同時進行多個登錄,同時仍可以很好地保護會話劫持。

您的描述表明您將隨機字符串存儲在用戶表中,該字符串當時只允許一次登錄。

+0

哦,我明白了。所以我需要在數據庫中存儲多個安全密鑰? – 2010-11-17 09:36:47

+0

是的。把它想象成一個用戶表和一個認證用戶表。 authenticated-users-table由一些安全令牌建立索引,幷包含對該令牌有效的用戶的引用。 – kusma 2010-11-17 09:43:15

+0

是的,你需要多個鍵。每個認證設備一個。 – 2010-11-17 16:20:05