다음을 통해 공유


멤버 자격 공급자 구현

업데이트: 2007년 11월

ASP.NET 멤버는 사용자의 ASP.NET 응용 프로그램에 다양한 멤버 공급자를 쉽게 사용할 수 있도록 디자인되었습니다. .NET Framework와 함께 제공되는 멤버 공급자를 사용하거나 공급자를 직접 구현할 수 있습니다.

사용자 지정 멤버 공급자를 만드는 주요 이유는 다음 두 가지입니다.

  • FoxPro 데이터베이스, Oracle 데이터베이스 또는 기타 데이터 소스와 같이 .NET Framework에 포함되지 않는 멤버 공급자로 지원되는 데이터 소스에 멤버 정보를 저장해야 합니다.

  • .NET Framework에서 제공되는 공급자에서 사용한 데이터베이스 스키마와는 다른 데이터베이스 스키마를 사용하여 멤버 정보를 관리해야 합니다. 이에 대한 일반적인 예로는 회사 또는 웹 사이트의 SQL Server 데이터베이스에 이미 존재하는 멤버 데이터를 들 수 있습니다.

필수 클래스

멤버 공급자를 구현하려면 System.Web.Security 네임스페이스에서 MembershipProvider 추상 클래스를 상속하는 클래스를 만듭니다. MembershipProvider 추상 클래스는 System.Configuration.Provider 네임스페이스에서 ProviderBase 추상 클래스를 상속하기 때문에 사용자는 ProviderBase 클래스의 필요한 멤버도 함께 구현해야 합니다. 다음 표에서는 ProviderBaseMembershipProvider 추상 클래스로부터 구현해야 하는 필요한 속성 및 메서드 목록과 각 항목에 대해 설명합니다. 각 멤버에 대한 구현을 검토하려면 샘플 멤버 자격 공급자 구현에 제공된 코드를 참조하십시오.

필요한 ProviderBase 멤버

멤버

설명

Initialize 메서드

구성 설정의 NameValueCollection과 공급자의 이름을 입력으로 사용합니다. 구성에서 제공된 구성 파일(Machine.config 또는 Web.config)에 지정된 구현 관련 값과 옵션을 비롯한 공급자 인스턴스에 대한 속성 값을 설정하는 데 사용됩니다.

필요한 MembershipProvider 멤버

멤버

설명

EnablePasswordReset 속성

구성 파일(Web.config)에 지정된 Boolean 값입니다.

EnablePasswordReset 속성은 사용자가 ResetPassword 메서드를 사용하여 현재 암호를 임의로 생성된 새 암호로 덮어쓸 수 있는지 여부를 나타냅니다.

이 속성은 읽기 전용입니다.

EnablePasswordRetrieval 속성

구성 파일(Web.config)에 지정된 Boolean 값입니다.

EnablePasswordRetrieval 속성은 사용자가 GetPassword 메서드를 사용하여 암호를 검색할 수 있는지 여부를 나타냅니다.

이 속성은 읽기 전용입니다.

RequiresQuestionAndAnswer 속성

구성 파일(Web.config)에 지정된 Boolean 값입니다.

RequiresQuestionAndAnswer 속성은 사용자가 GetPassword 메서드를 사용하여 암호를 검색하거나 ResetPassword 메서드를 사용하여 암호를 다시 설정하기 위해 암호 대답을 제공해야 하는지 여부를 나타냅니다.

이 속성은 읽기 전용입니다.

RequiresUniqueEmail 속성

구성 파일(Web.config)에 지정된 Boolean 값입니다.

RequiresUniqueEmail 속성은 사용자를 만들 때 고유한 전자 메일 주소 값을 제공해야 하는지 여부를 나타냅니다. 사용자가 현재 ApplicationName의 데이터 소스에 이미 있으면 CreateUser 메서드는 null(Visual Basic의 경우 Nothing)과 DuplicateEmail의 상태 값을 반환합니다.

이 속성은 읽기 전용입니다.

PasswordFormat 속성

구성 파일(Web.config)에 지정된 MembershipPasswordFormat 값입니다.

PasswordFormat 속성은 암호가 저장된 서식을 나타냅니다. 암호는 Clear, Encrypted 및 Hashed 암호 서식으로 저장할 수 있습니다. Clear 암호는 암호 저장 및 검색 성능은 향상되지만 보안성이 낮은 일반 텍스트로 저장됩니다. 따라서 데이터 소스가 손상될 경우 암호를 쉽게 읽을 수 있습니다. Encrypted 암호는 저장 시에 암호화되고 암호 비교나 암호 검색 시에는 해독될 수 있습니다. 이 방법은 암호 저장 및 검색을 위한 추가 처리가 필요하지만 데이터 소스가 손상되는 경우에도 암호를 쉽게 확인할 수 없으므로 보다 안전합니다. Hashed 암호는 데이터베이스에 저장될 때 단방향 해시 알고리즘 및 임의로 생성된 솔트 값을 사용하여 해시됩니다. 암호의 유효성을 검사할 때는 확인을 위해 데이터베이스에 있는 솔트 값을 사용하여 암호를 해시합니다. 해시된 암호는 검색할 수 없습니다.

MembershipProvider 클래스의 EncryptPasswordDecryptPassword 가상 메서드를 사용하여 암호 값을 암호화 및 해독하거나 사용자 고유의 암호화 코드를 제공할 수 있습니다. MembershipProvider 클래스의 EncryptPasswordDecryptPassword 가상 메서드를 사용하면 Encrypted 암호가 사용자 구성의 machineKey 요소(ASP.NET 설정 스키마)에 제공된 키 정보를 사용하여 암호화됩니다.

이 속성은 읽기 전용입니다.

MaxInvalidPasswordAttempts 속성

구성 파일(Web.config)에 지정된 Integer 값입니다.

MaxInvalidPasswordAttempts는 원치 않는 소스에서 반복적인 시도를 통해 멤버 사용자의 암호 또는 암호 대답을 추측하는 것을 방지하기 위해 PasswordAttemptWindow와 함께 사용됩니다. PasswordAttemptWindow에 지정된 시간(분) 동안 멤버 사용자에 대해 제공한 암호 또는 암호 질문의 오류 횟수가 MaxInvalidPasswordAttempts를 초과하면 IsLockedOut 속성이 true로 설정되어 멤버 사용자는 UnlockUser 메서드를 사용하여 해제되기 전까지는 계속 잠김 상태로 유지됩니다. MaxInvalidPasswordAttempts에 도달하기 전에 올바른 암호 또는 암호 대답을 제공하면 잘못된 시도 횟수를 추적하는 카운터가 0으로 다시 설정됩니다.

RequiresQuestionAndAnswer 속성을 false로 설정하면 잘못된 암호 대답 시도를 추적하지 않습니다.

잘못된 암호 및 암호 대답 시도는 ValidateUser, ChangePassword, ChangePasswordQuestionAndAnswer, GetPasswordResetPassword 메서드에서 추적됩니다.

이 속성은 읽기 전용입니다.

PasswordAttemptWindow 속성

구성 파일(Web.config)에 지정된 Integer 값입니다.

자세한 내용은 MaxInvalidPasswordAttempts 속성 설명을 참조하십시오.

이 속성은 읽기 전용입니다.

ApplicationName 속성

구성 파일(Web.config)에 지정된 멤버 정보를 사용하는 응용 프로그램 이름입니다. ApplicationName은 관련 사용자 정보와 함께 데이터 소스에 저장되며 해당 정보를 쿼리할 때 사용됩니다. 자세한 내용은 이 항목 뒷부분의 ApplicationName 단원을 참조하십시오.

이 속성은 읽기/쓰기가 가능하며 명시적으로 지정하지 않으면 ApplicationPath가 기본값으로 사용됩니다.

CreateUser 메서드

새 사용자 이름, 암호 및 전자 메일 주소를 입력으로 사용하고 응용 프로그램에 대한 새 사용자를 데이터 소스에 삽입합니다. CreateUser 메서드는 새로 만든 사용자에 대한 정보가 채워진 MembershipUser 개체를 반환합니다. CreateUser 메서드는 또한 out 매개 변수(Visual Basic의 경우 ByRef 사용 가능)를 정의합니다. 이 매개 변수는 사용자를 성공적으로 만들었는지 여부나 사용자를 만들지 못한 이유를 나타내는 MembershipCreateStatus 값을 반환합니다.

CreateUser 메서드는 ValidatingPassword 이벤트를 발생시키며 MembershipValidatePasswordEventHandler가 지정된 경우 이벤트 결과를 기반으로 사용자 만들기 작업을 계속하거나 취소합니다. OnValidatingPassword 가상 메서드를 사용하여 지정한 MembershipValidatePasswordEventHandler를 실행할 수 있습니다.

UpdateUser 메서드

사용자 정보로 채워진 MembershipUser 개체를 입력으로 사용하고 제공된 값으로 데이터 소스를 업데이트합니다.

DeleteUser 메서드

사용자 이름을 입력으로 사용하고 데이터 소스에서 해당 사용자 정보를 삭제합니다. DeleteUser 메서드는 사용자가 성공적으로 삭제된 경우 true를 반환하고 그렇지 않으면 false를 반환합니다. 또한 역할이나 프로필 정보와 같은 사용자에 대한 관련 정보가 삭제되었는지 여부를 나타내기 위해 추가 Boolean 매개 변수가 포함됩니다.

ValidateUser 메서드

사용자 이름과 암호를 입력으로 사용하고 데이터 소스에 있는 값과 일치하는지 확인합니다. ValidateUser 메서드는 사용자 이름 및 암호가 일치하면 true를 반환하고 그렇지 않으면 false를 반환합니다.

GetUser 메서드

고유한 사용자 식별자 및 해당 사용자가 현재 온라인 상태인지를 보여 주기 위해 사용자에 대한 LastActivityDate 값의 업데이트 여부를 나타내는 Boolean 값을 입력으로 사용합니다. GetUser 메서드는 지정된 사용자에 대해 데이터 소스에서 현재 값으로 채워진 MembershipUser 개체를 반환합니다. 사용자 이름을 데이터 소스에서 찾을 수 없으면 GetUser 메서드가 null(Visual Basic의 경우 Nothing)을 반환합니다.

GetUser 메서드

사용자 이름 및 해당 사용자가 현재 온라인 상태인지를 보여 주기 위해 사용자에 대한 LastActivityDate 값의 업데이트 여부를 나타내는 Boolean 값을 입력으로 사용합니다. GetUser 메서드는 지정된 사용자에 대해 데이터 소스에서 현재 값으로 채워진 MembershipUser 개체를 반환합니다. 사용자 이름을 데이터 소스에서 찾을 수 없으면 GetUser 메서드가 null(Visual Basic의 경우 Nothing)을 반환합니다.

GetAllUsers 메서드

데이터 소스의 모든 사용자에 대한 MembershipUser 개체로 채워진 MembershipUserCollection을 반환합니다.

GetAllUsers에서 반환된 결과는 pageIndex 및 pageSize 매개 변수의 제한을 받습니다. pageSize 매개 변수는 MembershipUserCollection에서 반환될 MembershipUser 개체의 최대 수를 나타냅니다. pageIndex 매개 변수는 결과 중 반환할 페이지를 지정하며 여기에서 1은 첫 번째 페이지를 나타냅니다. totalRecords 매개 변수는 총 멤버 사용자 수로 설정된 out 매개 변수입니다. 예를 들어 응용 프로그램에 대해 데이터베이스에 13명의 사용자가 있는 경우 pageIndex 값이 2이고 pageSize가 5인 경우, 반환된 MembershipUserCollection에는 반환된 6번째에서 10번째까지의 사용자가 포함됩니다. totalRecords는 13으로 설정됩니다.

GetNumberOfUsersOnline 메서드

LastActivityDate가 현재 날짜 및 시간에서 UserIsOnlineTimeWindow 속성을 뺀 값보다 큰 데이터 소스에서 모든 사용자의 수인 정수 값을 반환합니다. UserIsOnlineTimeWindow 속성은 사용자가 온라인인지 확인할 때 사용되는 시간(분 단위)을 지정하는 정수 값입니다.

ResetPassword 메서드

사용자 이름 및 암호 대답을 입력으로 사용하고 지정된 사용자에 대해 새로운 임의 암호를 생성합니다. ResetPassword 메서드는 데이터 소스의 사용자 정보를 새로운 암호 값으로 업데이트하고 string으로 새 암호를 반환합니다. Membership 클래스의 GeneratePassword 메서드는 임의 암호를 생성하기 위한 편리한 메커니즘입니다.

ResetPassword 메서드를 사용하면 작업을 수행하기 전에 EnablePasswordReset 속성이 true로 설정되도록 할 수 있습니다. EnablePasswordReset 속성이 false이면 NotSupportedException이 throw됩니다. ResetPassword 메서드는 또한 RequiresQuestionAndAnswer 속성의 값을 확인합니다. RequiresQuestionAndAnswer 속성이 true이면 ResetPassword 메서드가 제공된 암호 매개 변수의 값을 데이터 소스에 저장된 암호 대답과 비교합니다. 값이 일치하지 않으면 MembershipPasswordException이 throw됩니다.

ResetPassword 메서드는 ValidatingPassword 이벤트를 발생시키며 MembershipValidatePasswordEventHandler가 지정된 경우 새로 생성된 암호의 유효성을 검사하기 위해 이벤트 결과를 기반으로 암호 다시 설정 작업을 계속하거나 취소합니다. OnValidatingPassword 가상 메서드를 사용하여 지정한 MembershipValidatePasswordEventHandler를 실행할 수 있습니다.

GetPassword 메서드

사용자 이름 및 암호를 입력으로 사용하고 데이터 소스에서 해당 사용자의 암호를 검색하고 string으로 암호를 반환합니다.

ResetPassword를 사용하면 다른 작업을 수행하기 전에 GetPassword 속성이 true로 설정되도록 할 수 있습니다. EnablePasswordRetrieval 속성이 false이면 ProviderException이 throw됩니다.

GetPassword 메서드는 또한 RequiresQuestionAndAnswer 속성의 값을 확인합니다. RequiresQuestionAndAnswer 속성이 true이면 GetPassword 메서드가 제공된 암호 매개 변수의 값을 데이터 소스에 저장된 암호 대답과 비교합니다. 값이 일치하지 않으면 MembershipPasswordException이 throw됩니다.

GetUserNameByEmail 메서드

전자 메일 주소를 입력으로 사용하고 데이터 소스에서 해당 전자 메일 주소가 제공된 email 매개 변수 값과 일치하는 첫 번째 사용자 이름을 반환합니다.

일치하는 전자 메일 주소를 가진 사용자 이름이 없으면 빈 문자열이 반환됩니다.

특정 전자 메일 주소와 일치하는 여러 사용자 이름을 찾은 경우 첫 번째로 찾은 사용자 이름만 반환됩니다.

ChangePassword 메서드

사용자 이름, 현재 암호, 새 암호를 입력으로 사용하고 제공된 사용자 이름 및 현재 암호가 올바르면 데이터 소스에서 암호를 업데이트합니다. ChangePassword 메서드는 암호가 성공적으로 업데이트된 경우 true를 반환하고 그렇지 않으면 false를 반환합니다.

ChangePassword 메서드는 ValidatingPassword 이벤트를 발생시키며 MembershipValidatePasswordEventHandler가 지정된 경우 이벤트 결과를 기반으로 암호 변경 작업을 계속하거나 취소합니다. OnValidatingPassword 가상 메서드를 사용하여 지정한 MembershipValidatePasswordEventHandler를 실행할 수 있습니다.

ChangePasswordQuestionAndAnswer 메서드

사용자 이름, 암호, 암호 질문 및 암호 대답을 입력으로 사용하고 제공된 사용자 이름 및 암호가 올바르면 데이터 소스에서 암호 질문과 대답을 업데이트합니다. ChangePasswordQuestionAndAnswer 메서드는 암호 질문과 대답이 성공적으로 업데이트된 경우 true를 반환하고 그렇지 않으면 false를 반환합니다.

제공된 사용자 이름 및 암호가 올바르지 않으면 false가 반환됩니다.

FindUsersByName 메서드

구성된 ApplicationName에 대해 제공된 usernameToMatch와 일치하는 항목이 사용자 이름에 포함되어 있는 멤버 사용자 목록을 반환합니다. 예를 들어 usernameToMatch 매개 변수가 "user"로 설정된 경우 "user1", "user2", "user3" 등과 같은 사용자가 반환됩니다. 데이터 소스에 따라 와일드카드가 지원될 수 있습니다. 사용자는 사용자 이름에 따라 사전순으로 반환됩니다.

FindUsersByName에서 반환된 결과는 pageIndex 및 pageSize 매개 변수의 제한을 받습니다. pageSize 매개 변수는 MembershipUserCollection에서 반환될 MembershipUser 개체의 수를 나타냅니다. pageIndex 매개 변수는 결과 중 반환할 페이지를 지정하며 여기에서 1은 첫 번째 페이지를 나타냅니다. totalRecords 매개 변수는 usernameToMatch 값과 일치하는 총 멤버 사용자 수로 설정된 out 매개 변수입니다. 예를 들어 usernameToMatch가 일부 또는 전체 사용자 이름과 일치하는 사용자가 13명 검색되고 pageIndex 값이 2이고 pageSize가 5인 경우, MembershipUserCollection에는 반환된 6번째에서 10번째까지의 사용자가 포함됩니다. totalRecords는 13으로 설정됩니다.

FindUsersByEmail 메서드

구성된 ApplicationName에 대해 제공된 emailToMatch와 일치하는 항목이 사용자 이름에 포함되어 있는 멤버 사용자 목록을 반환합니다. 예를 들어 emailToMatch 매개 변수가 "address@example.com"으로 설정된 경우 "address1@example.com", "address2@example.com" 등의 전자 메일 주소를 갖는 사용자가 반환됩니다. 데이터 소스에 따라 와일드카드가 지원될 수 있습니다. 사용자는 사용자 이름에 따라 사전순으로 반환됩니다.

FindUsersByEmail에서 반환된 결과는 pageIndex 및 pageSize 매개 변수의 제한을 받습니다. pageSize 매개 변수는 MembershipUserCollection 컬렉션에서 반환될 MembershipUser 개체의 수를 나타냅니다. pageIndex 매개 변수는 결과 중 반환할 페이지를 지정하며 여기에서 1은 첫 번째 페이지를 나타냅니다. totalRecords 매개 변수는 emailToMatch 값과 일치하는 총 멤버 사용자 수로 설정된 out 매개 변수입니다. 예를 들어 emailToMatch가 일부 또는 전체 사용자 이름과 일치하는 사용자가 13명 검색되고 pageIndex 값이 2이고 pageSize가 5인 경우, MembershipUserCollection에는 반환된 6번째에서 10번째까지의 사용자가 포함됩니다. totalRecords는 13으로 설정됩니다.

UnlockUser 메서드

사용자 이름을 입력으로 사용하고 IsLockedOut 속성을 false로 저장하는 데이터 소스의 필드를 업데이트합니다. UnlockUser 메서드는 멤버 사용자에 대한 레코드가 성공적으로 업데이트된 경우 true를 반환하고 그렇지 않으면 false를 반환합니다.

ApplicationName

멤버 공급자는 각 응용 프로그램에 대해 고유하게 사용자 정보를 저장합니다. 이렇게 하면 중복 사용자 이름이 만들어지는 경우에도 여러 ASP.NET 응용 프로그램에서 충돌을 일으키지 않고 동일한 데이터 소스를 사용할 수 있습니다. 또는 동일한 ApplicationName을 지정하여 여러 ASP.NET 응용 프로그램에서 동일한 사용자 데이터 소스를 사용할 수 있습니다.

멤버 공급자는 각 응용 프로그램에 대해 고유하게 사용자 정보를 저장하기 때문에 데이터 스키마에 응용 프로그램 이름과 해당 쿼리가 포함되는지 확인하고 업데이트에도 응용 프로그램 이름이 포함되는지 확인해야 합니다. 예를 들어 다음 명령은 전자 메일 주소에 따라 데이터베이스에서 사용자 이름을 검색하는 데 사용되며 쿼리에 ApplicationName이 포함되는지 확인합니다.

SELECT Username FROM MyUserTable 
  WHERE Email = 'someone@example.com' AND ApplicationName = 'MyApplication'

사용자 지정 멤버

사용자는 ProviderBaseMembershipProvider 추상 클래스에서 제공되지 않는 추가 기능으로 멤버 공급자 인터페이스를 확장해야 합니다. 멤버 공급자에 추가하는 모든 공용 멤버는 Membership 클래스의 Provider 또는 Providers 속성을 사용하여 액세스할 수 있습니다.

이에 대한 예로는 IsLockedOut 속성을 true로 설정하는 LockUser 메서드를 들 수 있습니다. 다음 예제에서는 사용자 지정 LockUser 메서드를 호출하기 위해 응용 프로그램에 대한 기본 멤버 공급자를 사용자 지정 공급자 형식으로 노출시키는 Provider 속성의 캐스팅 방법을 보여 줍니다.

Dim p As MyCustomProvider = CType(Membership.Provider, MyCustomProvider)
p.LockUser(username)
MyCustomProvider p = (MyCustomProvider)Membership.Provider;
p.LockUser(username);

스레드로부터의 안전성

응용 프로그램 구성에 지정된 각 멤버 공급자에 대해 ASP.NET은 HttpApplication 개체에 의해 제공된 모든 요청에 사용되는 단일 멤버 공급자 인스턴스를 인스턴스화합니다. 그 결과 여러 요청을 동시에 실행할 수 있습니다. ASP.NET은 공급자에 대한 호출의 스레드로부터의 안전성을 보장하지 않습니다. 사용자는 스레드로부터 안전하게 보호하도록 공급자 코드를 작성해야 합니다. 예를 들어 데이터베이스에 대한 연결을 만들거나 편집할 파일을 여는 작업은 Initialize 메서드가 호출될 때 파일 또는 데이터베이스 연결을 여는 대신 CreateUser와 같이 호출된 멤버 내에서 수행되어야 합니다.

참고 항목

개념

샘플 멤버 자격 공급자 구현

ASP.NET 사이트 탐색 보안

참조

ValidatePasswordEventArgs

OnValidatingPassword

기타 리소스

멤버 자격을 사용하여 사용자 관리

ASP.NET 웹 사이트 보안