2008-12-10 10 views
6

Tôi đã phải tạo nhà cung cấp thành viên tùy chỉnh cho dự án ASP .Net hiện tại của mình để phù hợp với lược đồ cơ sở dữ liệu của chúng tôi và đang gặp sự cố khi cấu hình khóa một người dùng nếu họ nhận được mật khẩu của họ sai ba lần, như được hỗ trợ bởi các nhà cung cấp tiêu chuẩn.Khóa người dùng trong ASP .Net Nhà cung cấp tư cách thành viên tùy chỉnh

Đây có phải là điều tôi cần phải thực hiện bản thân mình hay nó nên được hỗ trợ vốn có không?

Tôi không có mã giao dịch cụ thể với nó (và không ai trong số các thành viên giao diện dường như đối phó cụ thể), nhưng nếu tôi cần tự mình triển khai, làm cách nào để thông báo cho người dùng rằng họ bị khóa? Tôi có cần phải tăng một số loại ngoại lệ trong ValidateUser không?

Giải pháp

xấu hổ tôi không thể đánh dấu hai câu trả lời, các liên kết được cung cấp bởi Dave R cung cấp cho một lớn trong nghiên cứu sâu về tác phẩm thành viên như thế nào, và những gì Zhaph chỉ ra là chỉ là những gì tôi đã kết thúc làm, xử lý logic bị khóa trong nhà cung cấp tư cách thành viên tùy chỉnh.

Sau đó, tôi đã xử lý điều kiện lỗi bằng cách sử dụng sự kiện LoginError của Kiểm soát đăng nhập và kiểm tra trong đó để xem liệu người dùng có bị khóa không để hiển thị thông báo lỗi thích hợp.

Trả lời

7

Scott Mitchell đã viết một loạt hướng dẫn tuyệt vời trên trang ASP.NET. Liên kết này bao gồm thông tin về việc tạo ra một nhà cung cấp tùy chỉnh và thảo luận logic khóa:

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

Ngoài ra còn có phương pháp trong xây dựng để mở khóa tài khoản (tức là bạn phải làm điều này thông qua các công cụ cơ sở dữ liệu nếu bạn đang sử dụng một cái gì đó tương tự như SqlMembershipProvider). Scott cũng đã viết một bài viết về việc tạo ra một giao diện người dùng để quản lý này, mà bạn có thể tìm thấy ở đây:

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

Tôi thực sự khuyên bạn nên đọc toàn bộ loạt. Scott là một người giao tiếp tuyệt vời.

Tôi hy vọng điều này sẽ hữu ích.

+0

Liên kết đầu tiên trông rất hữu ích - cảm ơn! –

0

Trong nhà cung cấp tư cách thành viên tùy chỉnh của bạn, bạn nên triển khai chức năng ValidateUser. Ở đó bạn không chỉ kiểm tra xem tên người dùng và mật khẩu có hợp lệ không, nhưng bạn cũng có thể lấy số lần thử mật khẩu không hợp lệ, vv từ kho dữ liệu của bạn. Nếu tên người dùng/mật khẩu hợp lệ, hãy đặt lại số lần thử mật khẩu, số khác sẽ tăng số lần thử. SqlMembershipProvider cũng lưu trữ datetime LastAttempt, vì vậy bạn không thể bruteforce bạn theo cách bởi vì bạn không được phép cố gắng trong một khung thời gian nhất định.

3

Đây là điều bạn phải tự viết.

Giản đồ cơ sở dữ liệu mặc định có các cột sau trong bảng aspnet_Membership:

IsLockedOut 
FailedPasswordAttemptCount 
FailedPasswordAttemptWindowStart 

Số đếm nỗ lực sẽ được tăng lên trên tất cả các thất bại trong cửa sổ nỗ lực, và thời điểm thất bại đầu tiên được lưu trữ trong cột bắt đầu cửa sổ, một khi FailedPasswordAttemptCount bằng maxInvalidPasswordAttempts từ cấu hình, IsLockedOut được đặt.

Như Michiel khẳng định, phương pháp ValidateUser của bạn sau đó sẽ cần phải kiểm tra các giá trị dựa trên các thiết lập trong cấu hình nhà cung cấp - theo mặc định đây là:

maxInvalidPasswordAttempts="5" 
passwordAttemptWindow="10" 

Khi người dùng đã có những nỗ lực đăng nhập tối đa, bạn sẽ cần phải đảm bảo rằng bạn đã thiết lập MembershipUser.IsLockedOut được thiết lập từ nhà cung cấp của bạn - sau đó bạn có thể kiểm tra giá trị đó và xử lý một cách thích hợp - nếu bạn đang sử dụng các điều khiển Login mặc định, giá trị này có thể đã được kiểm tra cho bạn.

2

Tái tạo các điều kiện dẫn đến khóa máy (quá nhiều lần đăng nhập xấu). Bởi vì các nhà cung cấp thành viên thực hiện một chuyến đi đến chương trình phụ trợ của họ mỗi lần, nó là hợp lý để hạn chế cách tiếp cận này cho các nhà cung cấp với số lượng hợp lý của MaxInvalidPasswordAttempts.

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