2011-02-08 120 views
21

使用FormsAuthentication建成asp.net這是非常快速和容易地創建用於身份驗證的用戶創建一個cookie登錄系統:在的Web.Config文件與一些代碼配對FormsAuthentication:安全嗎?

FormsAuthentication.SetAuthCookie(uniqueUsername, false); 

<authentication mode="Forms"> 
    <forms loginUrl="Login.aspx" timeout="30" defaultUrl="Dashboard.aspx" protection="All" /> 
</authentication> 
<authorization> 
    <deny users="?" /> 
</authorization> 

,直到用戶進行認證。這會反彈所有請求回的Login.aspx和餅乾是使用SetAuthCookie()方法調用創建的。

這樣安全嗎?
我使用的經驗法則是我不在客戶端存儲他們沒有發送給我的任何數據。所以我過去所做的就是保存cookie中使用的用戶名和密碼,然後用每個請求重新驗證它。

使用這種方法每次都有額外的重新驗證開銷,但這也意味着我沒有在客戶端上存儲任何服務器數據。

我擔心
我擔心的是,通過使用SetAuthCookie()方法調用,該用戶名被存儲在客戶機上。那麼是否有人可以破解正在使用的加密,並替換爲另一個存儲的用戶名?

我覺得我太過分偏執,所使用的加密類型和級別是足夠的,但我認爲我會得到關於該主題的一些專家意見。

+3

可能的重複http://stackoverflow.com/questions/133106/how-secure-is-basic-forms-authentication-in-asp-net – 5arx 2011-02-08 16:05:26

+1

我不投票結束,這個問題不直接重複前述的網址。 – 2011-02-08 17:20:25

+0

爲什麼你有<授權> <拒絕用戶=「?」 /> 在web.config中? – Rushino 2011-12-07 20:00:26

回答

40

所以,我已經在過去做的是保持在cookie中使用的用戶名和密碼,然後重新正宗這與每個請求。

你應該不是使用這種方法。密碼應該而不是被存儲在認證票證中。原因是如果認證票證受到攻擊,攻擊者擁有用戶的密碼。這種風險可以通過加密身份驗證票據cookie來緩解,但我認爲您以純文本格式存儲Cookie。

我擔心的是,通過使用SetAuthCookie()方法調用,用戶名被存儲在客戶機上。那麼是否有人可以破解正在使用的加密,並替換爲另一個存儲的用戶名?

正如Shiraz指出的那樣,如果您創建持久性cookie,cookie只會在客戶端計算機上持久存在。 (SetAuthCookie的其中一個參數表示是否創建這樣的cookie

即使有人打破加密方案來修改cookie以提供其他用戶名,他們也會遇到問題,因爲身份驗證票也是數字式的這意味着ASP.NET可以檢測cookie的內容是否已經被修改,爲了僞造數字簽名,攻擊者需要知道服務器使用的鹽,如果用戶能夠弄清楚它意味着他有權訪問你的網絡服務器的文件系統,所以現在你有更大的問題

要理解的另一件事是認證票有一個到期,這使票的有效期限有限,所以即使有人要竊取用戶的cookies,攻擊者必須使用該被盜票據的時間將受限於您爲表單身份驗證系統(默認爲30分鐘)指定的timeout值。

總之,官方的ASP.NET表單認證系統將比單獨的開發人員能夠實現的東西更安全。開發人員應該努力使用表單身份驗證系統,而不是出於各種原因推出他們自己的解決方案,包括更好的安全性,不必重新發明輪子,採用標準實踐,以便加入團隊的其他開發人員沒有那麼大的學習曲線以加快速度,等等。

有關表單身份驗證系統以及票證如何保護,各種<forms>配置設置如何工作等的更多細節,請參閱:Forms Authentication Configuration and Advanced Topics

3

如果將DisplayRememberMe屬性設置爲false,則cookie將不會保留在客戶端計算機上。它將被存儲在內存中。

如果您使用HTTPS/SSL,它將在到客戶端計算機的路上受到保護。

有那麼只有理論上的可能性左:

  • 突破SSL加密
  • 從客戶機

其次是打破上的Cookie加密的記憶偷餅乾。

可能有一些更簡單的方法來攻擊你的系統。

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

7

只是你的思維過程有些隨意發言,但關於

所以我過去所做的是保持 在 餅乾所使用的用戶名和密碼,然後重新正宗此每個請求與 。

@Scott Mitchell已經提出了這個問題,並且討論了不這樣做的原因,這是由於這種安全性的影響。

我覺得值得指出爲什麼這樣做沒有意義(甚至不考慮泄漏信息的安全含義)。您生成表單身份驗證票證(cookie)的原因是,您讓ASP.NET使用該票證來標記此用戶瀏覽器,以便您確認這是指定的已經過身份驗證的用戶。

通過向他們發放一張票,您意味着他們不需要進行身份驗證,因爲他們以前已經過。

一個很好的比喻是你得到了一個酒吧,在你的路上讓你的ID由保鏢掃描,以確保你的ID是合法的,你超過了21歲。一旦確認這一點,他們給你一種顏色/設計的腕帶。

用你的手腕帶,你可以離開建築物吸菸,然後繞過線路返回,並且需要讓你的身份證掃描,以便當天返回。現在你應該回​​家了,但是當你睡覺的時候(比如讓瀏覽器打開過夜),不要把手腕帶拿下來,第二天你會回到酒吧,並試圖讓你的手腕帶繞過線路。在這一點上,你被拒絕了,因爲你有最後一晚的手腕帶,並被告知要到達線後面並再次獲得授權。