문제

데이터베이스 스키마에 맞추기 위해 현재 ASP .Net 프로젝트에 대한 사용자 지정 멤버십 공급자를 만들어야 했고, 다음에서 지원하는 대로 암호를 세 번 틀리면 사용자를 잠그도록 구성하는 데 문제가 있습니다. 표준 공급자.

이것은 내가 직접 구현해야 하는 것입니까, 아니면 본질적으로 지원되어야 하는 것입니까?

이 문제를 구체적으로 처리하는 코드가 없고(인터페이스 멤버 중 누구도 이를 구체적으로 처리하지 않는 것 같습니다), 직접 구현해야 하는 경우 사용자에게 잠겨 있음을 알리려면 어떻게 해야 합니까?ValidateUser에서 일종의 예외를 발생시켜야 합니까?

해결책

안타깝지만 두 가지 답변을 표시할 수 없습니다. Dave R이 제공한 링크는 멤버십이 어떻게 작동하는지에 대한 심층적인 정보를 제공하며 Zhaph가 지적한 것은 제가 결국 수행한 작업, 즉 사용자 정의 멤버십 공급자에서 잠긴 논리를 처리하는 것이었습니다.

그런 다음 Login 컨트롤의 LoginError 이벤트를 사용하여 오류 조건을 처리하고 적절한 오류 메시지를 표시하기 위해 사용자가 잠겨 있는지 확인했습니다.

도움이 되었습니까?

해결책

Scott Mitchell은 ASP.NET 사이트에 훌륭한 자습서 시리즈를 작성했습니다.이 링크에는 사용자 정의 공급자 생성에 대한 정보가 포함되어 있으며 잠금 논리에 대해 설명합니다.

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

계정을 잠금 해제하는 내장된 방법도 없습니다(예:SqlMembershipProvider와 유사한 것을 사용하는 경우 데이터베이스 도구를 통해 이 작업을 수행해야 합니다.Scott은 이를 관리하기 위한 UI 생성에 대한 기사도 작성했습니다. 해당 기사는 여기에서 찾을 수 있습니다.

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

실제로 전체 시리즈를 읽는 것이 좋습니다.Scott은 훌륭한 의사소통 능력을 갖고 있습니다.

이게 도움이 되길 바란다.

다른 팁

이것은 당신이 직접 작성해야 할 것입니다.

기본 데이터베이스 스키마의 aspnet_Membership 테이블에는 다음 열이 있습니다.

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

시도 횟수는 시도 창 내에서 시도가 실패할 때마다 증가하고 첫 번째 시도 실패 시간은 창 시작 열에 저장됩니다. FailedPasswordAttemptCount가 구성의 maxInvalidPasswordAttempts와 동일하면 IsLockedOut이 설정됩니다.

Michiel이 말한 것처럼 ValidateUser 메서드는 공급자 구성의 설정을 기반으로 이러한 값을 확인해야 합니다. 기본적으로 다음과 같습니다.

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

사용자가 최대 로그인 시도 횟수를 달성한 후에는 MembershipUser.IsLockedOut이 공급자로부터 설정되었는지 확인해야 합니다. 그런 다음 해당 값을 확인하고 적절하게 동작할 수 있습니다. 기본 로그인 컨트롤을 사용하는 경우 이 값은 이미 확인되었을 것입니다.

잠금으로 이어지는 조건(잘못된 로그인 시도가 너무 많음)을 복제합니다.멤버십 공급자는 매번 백엔드로 이동하기 때문에 합리적인 수의 MaxInvalidPasswordAttempts를 가진 공급자로 이 접근 방식을 제한하는 것이 합리적입니다.

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

사용자 지정 멤버십 공급자에서 ValidateUser 함수를 구현해야 합니다.여기에서 사용자 이름과 비밀번호가 유효한지 확인할 뿐만 아니라 데이터 저장소에서 잘못된 비밀번호 시도 횟수 등도 검색할 수 있습니다.사용자 이름/비밀번호가 유효하면 비밀번호 시도 횟수를 재설정하고, 그렇지 않으면 시도 횟수를 늘립니다.SqlMembershipProvider는 LastAttempt 날짜/시간도 저장하므로 특정 시간 내에 시도가 허용되지 않기 때문에 무차별 공격을 가할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top