FormsAuthentication:它安全嗎?
在asp.net中使用FormsAuthentication可以非常快速和輕鬆地創建一個登錄系統,為經過身份驗證的使用者創建一個 cookie:
FormsAuthentication.SetAuthCookie(uniqueUsername, false);與Web.Config文件中的一些程式碼配對:
<authentication mode="Forms"> <forms loginUrl="Login.aspx" timeout="30" defaultUrl="Dashboard.aspx" protection="All" /> </authentication> <authorization> <deny users="?" /> </authorization>這會將所有請求退回到Login.aspx,直到使用者被批准並使用 SetAuthCookie() 方法呼叫創建 cookie。
這足夠安全嗎?
我使用的經驗法則是,我不會在客戶端上儲存他們沒有發送給我的任何數據。所以我過去所做的是保存cookie中使用的使用者名和密碼,然後對每個請求重新驗證。
使用這種方法每次都重新進行身份驗證會產生額外的成本,但這也意味著我沒有在客戶端上儲存任何伺服器數據。
我的擔心
我擔心的是,通過使用 SetAuthCookie() 方法呼叫,使用者名被儲存在客戶端機器上。那麼有人是否有可能破解正在使用的加密並將儲存的使用者名替換為另一個使用者名?
我認為我過於偏執,並且使用的加密類型和級別是足夠的,但我認為我會就該主題獲得一些專家意見。
所以我過去所做的是保存cookie中使用的使用者名和密碼,然後對每個請求重新驗證。
你不應該使用這種方法。密碼不應儲存在身份驗證票中。原因是如果身份驗證票證被洩露,那麼攻擊者就有了使用者的密碼。可以通過加密身份驗證票證 cookie 來減輕這種風險,但我假設您以純文字形式儲存 cookie。
我擔心的是,通過使用 SetAuthCookie() 方法呼叫,使用者名被儲存在客戶端電腦上。那麼有人是否有可能破解正在使用的加密並將儲存的使用者名替換為另一個使用者名?
正如 Shiraz 所指出的,只有在您創建持久性 cookie 時,cookie 才會持久化在客戶端電腦上。(用於
SetAuthCookie指示是否創建此類 cookie 的參數之一。即使有人破壞了加密方案以修改 cookie 以提供不同的使用者名,他們也會遇到問題,因為身份驗證票證也是數字簽名的,這意味著 ASP.NET 可以檢測 cookie 的內容是否已被修改。要偽造數字簽名,攻擊者需要知道伺服器使用的鹽,如果使用者能弄清楚這意味著他可以訪問您的 Web 伺服器的文件系統,那麼現在您遇到了更大的問題。
要理解的另一件事是身份驗證票證有一個到期日,這為票證的有效性設置了有限的生命週期。因此,即使有人要竊取使用者的 cookie,攻擊者必須使用該被盜票證的時間也會根據
timeout您為表單身份驗證系統指定的值(預設為 30 分鐘)受到限制。總之,官方的 ASP.NET 表單身份驗證系統將比單獨的開發人員能夠實現的安全得多。開發人員應該努力使用表單身份驗證系統,而不是出於各種原因推出自己的解決方案,包括更好的安全性、不必重新發明輪子、採用標準實踐以使其他加入團隊的開發人員沒有那麼大的學習曲線以加快速度,等等。
<forms>有關表單身份驗證系統以及如何保護票證、各種配置設置如何工作等的更多細節,請參閱:表單身份驗證配置和高級主題。