2008-12-10 117 views
6

我不得不爲了適應我們的數據庫模式創建我目前的ASP .NET項目自定義成員資格供應商的用戶,和我在配置它閉鎖問題一個用戶,如果他們的密碼錯誤三次,這是由標準提供商支持的。鎖定了在ASP .NET自定義成員資格提供

這是不是我需要實現我自己,還是應該把它內在地支持?

我沒有專門處理它的代碼(並且沒有一個接口成員專門處理它),但是如果我需要自己實現它,我該如何去通知用戶它們被鎖定?我需要在ValidateUser中引發某種異常嗎?

解決方案

恥辱,我不能標記兩個答案,由戴夫 - [R提供的鏈接給予深入瞭解一個偉大的成員是如何工作的,以及什麼Zhaph指出,正是我結束了做,處理自定義成員資格提供程序中鎖定的邏輯。

我然後使用登錄控件的LoginError事件處理的錯誤條件,並在那裏檢查,看看如果用戶爲了顯示相應的錯誤信息鎖定。

回答

7

斯科特·米切爾寫了一個極好的一系列關於ASP.NET網站的教程。此鏈接包括創建自定義提供的信息,並討論了鎖定邏輯:

http://www.asp.net/LEARN/security/tutorial-06-cs.aspx

但也沒有內置的方法來解鎖帳戶(即你必須通過數據庫工具來做到這一點,如果你正在使用的東西類似於SqlMembershipProvider)。斯科特也寫了一篇文章有​​關創建用戶界面來管理這一點,你可以在這裏找到:

http://www.asp.net/LEARN/security/tutorial-14-vb.aspx

其實我建議你閱讀整個系列。斯科特是一位出色的溝通者。

我希望這會有所幫助。

+0

該第一個鏈接看起來非常有用 - 謝謝! – 2012-03-16 06:18:14

0

在您的自定義成員資格提供者,你應該實現的ValidateUser功能。你不僅要檢查用戶名和密碼是否有效,還要從數據存儲中檢索無效密碼嘗試次數等。如果用戶名/密碼有效,請重置密碼嘗試次數,否則會增加嘗試次數。 SqlMembershipProvider還存儲LastAttempt的日期時間,所以你不能暴露你的方式,因爲你不允許在特定時間範圍內嘗試。

3

這是東西,你必須自己寫。

默認的數據庫模式已在aspnet_Membership表中的下列:

IsLockedOut 
FailedPasswordAttemptCount 
FailedPasswordAttemptWindowStart 

的嘗試次數會在嘗試窗口內的每一個失敗的嘗試遞增,並且第一個失敗的嘗試的時間存儲在窗口起始列,一旦FailedPasswordAttemptCount等於配置中的maxInvalidPasswordAttempts,就會設置IsLockedOut。

正如米歇爾指出,您的ValidateUser方法則需要基於提供的配置設置,以檢查這些值 - 默認情況下它們是:

maxInvalidPasswordAttempts="5" 
passwordAttemptWindow="10" 

一旦用戶有最大的登錄嘗試,你需要確保你已經設置了MembershipUser.IsLockedOut從你的提供者設置 - 然後你可以檢查該值並且適當地運行 - 如果你使用的是默認的登錄控件,那麼這個值可能已經被檢查過了。

2

複製導致鎖定的條件(太多錯誤的登錄嘗試)。 因爲會員供應商每次都會前往其後端,因此將此方法限制爲具有合理數量的MaxInvalidPasswordAttempts的供應商是明智的。

if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100) 
     { 
       for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++) 
       { 
        Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl"); 
       } 
     } 
相關問題