8

我試圖找出使用基於會話ID認證VS基於Cookie認證認證會話ID VS餅乾

就的優點和缺點,我可以在基於Cookie認證見

  • 用戶提交登錄請求發送他們的憑據
  • 憑據針對數據庫檢查
  • cookie將與用戶的細節設置
  • 這將通過https完成,cookies將被加密。
  • 在.NET中,如果這是authcookie用戶身份將被設置
  • 的DB是打了一次,並且後續調用只檢查身份驗證cookie的

在基於會話的認證的情況下

  • 用戶提交登錄請求發送其憑據
  • 憑據檢查數據庫
  • 將生成會話ID並也存儲在一個數據庫
  • cookie將與用戶的詳細信息,並生成會話ID
  • 後續調用會比較反對一個會話ID在數據庫
  • 該DB命中每次
設置

問題

是否有任何理由更喜歡一個比另一個?基於cookie的安全性是否較低(即使您對它們進行了加密和簽名)?基於會話的性能是否因爲在每次調用期間碰到數據庫而變得更糟?我看到幾個站點傾向於某種方式,但無法清楚地瞭解使用哪種方法。任何討論/建議將不勝感激。

回答

7

我很難消化這個問題。據我所知,基於表單的身份驗證有兩種口味:Cookie和Cookieless。基於Cookie的身份驗證是首選。

在基於cookie的版本中,用戶獲取一個coookie,其值是一個加密的Forms Authentication Ticket。該cookie在服務器上被加密。除非加密密鑰從machine.config共享或在Web.config中覆蓋,否則cookie只能由發佈它的服務器解密。我相信加密是AES,這是非常安全的。

在無cookie的方法中,cookie的有效載荷使用HTTPModule放入網址中。這種方法僅在設備不支持cookies(罕見)時才使用。無cookie的方法不是首選 - 它使AJAX更加困難。

參見:

http://msdn.microsoft.com/en-us/library/1d3t3c61.aspx

http://support.microsoft.com/kb/910443

+0

道歉延遲答覆。目前,我正在審覈一些實際上在用戶登錄時創建會話密鑰的代碼(Java),並將其作爲cookie存儲,並且每次調用受保護的服務時,都會獲取會話密鑰並檢查數據庫以查看會話是否處於活動狀態。這似乎是一個不同於asp窗體auth的設計,我們每次都不打db。會話和檢查數據庫的方法似乎效率低下。我是這麼想的嗎? – user275157

+3

我的意見:通過會話檢查來查詢每個請求並不是什麼大問題。會話表本身將需要仔細索引和優化以避免瓶頸。 – Brett

+0

謝謝。而且可以肯定 - 我認爲上述方法不一定比表單認證方法更安全嗎? – user275157