我想爲我正在建設的ASP.NET MVC網站實現「記住我」登錄功能。我試圖用這種方法http://jaspan.com/improved_persistent_login_cookie_best_practice(見'米勒的設計'靠近頂部),並在一定程度上工作。「記住我」登錄網站 - 問題與不同的瀏覽器/電腦
因此,工作流程是:
- 在用戶登錄併發出加密的安全隨機字符串+他們的數據庫ID作爲永久性的Cookie(持續約30天)。安全字符串存儲在他們的用戶帳戶記錄旁邊的數據庫中。
- 用戶後來回到瀏覽器顯示登錄cookie的站點,在數據庫中查找ID和安全密鑰,如果找到匹配項,用戶將自動進行身份驗證。
- 一旦通過身份驗證,就會生成一個新的安全密鑰,並存儲在數據庫中併發布新的cookie。
我有這個工作正常,但是,如果用戶從多個瀏覽器或計算機登錄它不工作得很好。顯然,不同的瀏覽器將最終存儲在cookie中的不同安全密鑰,因此工作流程變爲:
- 用戶從瀏覽器時,登錄時,會發出安全密鑰的cookie,密鑰存儲在數據庫中。
- 用戶從瀏覽器B登錄,發出與cookie不同的安全密鑰。密鑰也存儲在數據庫中,但會覆蓋從瀏覽器A生成的密鑰。
- 用戶再次從瀏覽器A訪問網站,瀏覽器顯示從步驟1發出的cookie,但它不再匹配,因爲在步驟2中更換了安全密鑰。用戶必須重新登錄。另一種新的密鑰生成,並覆蓋發給瀏覽器B.
- 用戶可以從瀏覽器中乙又來,密鑰不匹配訪問的關鍵,必須再次登錄等等,等等
我該如何解決這個問題?我是否需要在數據庫中存儲和維護多個密鑰?我甚至會以正確的方式去做這件事嗎?我注意到StackOverflow似乎可以管理這一點,並記住我從不同的瀏覽器和計算機。
哦,我明白了。所以我需要在數據庫中存儲多個安全密鑰? – 2010-11-17 09:36:47
是的。把它想象成一個用戶表和一個認證用戶表。 authenticated-users-table由一些安全令牌建立索引,幷包含對該令牌有效的用戶的引用。 – kusma 2010-11-17 09:43:15
是的,你需要多個鍵。每個認證設備一個。 – 2010-11-17 16:20:05