요약: asp.net 2.0의 멤버십 구성 요소는 개발자가 사용자 관리 및 사용자 확인을 수행할 수 있는 매우 간단하고 사용하기 쉬운 인터페이스 세트를 제공합니다. 이 글에서는 구현 원리를 간략하게 분석하고, 올바르게 사용하는 방법과 확장하는 방법을 소개합니다.
1. MembershipProvider 추상 클래스
Membership을 사용할 때 이 클래스를 직접 사용하지 않는 경우가 많습니다. MembershipProvider 클래스는 일부 추상 메서드와 추상 특성을 정의하며 Membership 인터페이스의 기본 사양을 구성하며 .NET 프레임워크 내에서 Membership을 사용하는 기능은 모두 이 형식을 통해 호출됩니다. 상속된 클래스는 이러한 인터페이스를 구현하여 다양한 환경에서 사용자 관리 기능을 제공하며 Membership 프레임워크 자체에는 영향을 미치지 않습니다. MembershipProvider의 프로토타입 정의를 살펴보겠습니다.
공용 추상 클래스 MembershipProvider : ProviderBase
...{
// 이벤트
공용 이벤트 MembershipValidatePasswordEventHandler ValidatingPassword;
// 메소드
protected MembershipProvider();
public abstract bool ChangePassword(string 사용자 이름, string oldPassword, string newPassword);
public abstract bool ChangePasswordQuestionAndAnswer(string 사용자 이름, 문자열 newPasswordQuestion, 문자열 newPasswordAnswer)
; 비밀번호, 문자열 이메일, 문자열 비밀번호 질문, 문자열 비밀번호응답, bool isApproved, 개체 공급자UserKey, out MembershipCreateStatus 상태);
보호된가상
바이트[] DecryptPassword(byte[] encodePassword)
; (문자열 패스, int 비밀번호 형식, 문자열 솔트);
보호된 가상 바이트[] EncryptPassword(바이트[] 비밀번호);
공개 추상
MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageSize, int totalRecords);
, int pageIndex, int pageSize, out int totalRecords)
;
공개 추상 MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
;
공개 추상 문자열 GetPassword(string username, string 답변);
공개 추상 MembershipUser GetUser(개체 공급자UserKey, bool userIsOnline);
내부
MembershipUser
GetUser(string 사용자 이름, bool userIsOnline, bool throwOnError);
protected virtual void OnValidatingPassword(ValidatePasswordEventArgs e);
public abstract string ResetPassword(string 사용자 이름, 문자열 답변)
;
public abstract bool UnlockUser
(MembershipUser user);
공개 추상 bool ValidateUser(문자열 사용자 이름, 문자열 비밀번호);
// 속성
공개 추상 문자열 ApplicationName ...{ get
;
}
공개 추상 bool EnablePasswordRetrieval ...{ get
;
abstract int MinRequiredNonAlphanumericCharacters ...{ get
; } 공용 추상 int MinRequiredPasswordLength ...{ get
; }
공용
추상 MembershipPasswordFormat PasswordFormat ...{ get;
{ 가져오기; }
공개 추상 bool RequiresQuestionAndAnswer ...{ 가져오기 }
공개 추상 bool RequiresUniqueEmail ...{ 가져오기;
// 필드
private MembershipValidatePasswordEventHandler _EventHandler;
private const int SALT_SIZE_IN_BYTES = 0x10
;
내부 수정자는 비밀번호를 암호화, 해독 및 확인하는 데 사용되는 비밀번호의 보조 방법인 여러 방법입니다. 그런데 여기서는 디자인에 문제가 있는 것 같습니다. 이러한 메소드를 내부 범위로 정의하는 것은 재사용이 가능하도록 기본 클래스에 정의하는 것이 다소 부적절해 보입니다. 내부 멤버는 이 어셈블리 내에서만 사용할 수 있기 때문에(일반적인 상황에서는 리플렉션과 같은 다른 메서드는 포함되지 않음), 이는 확장된 MembershipProvider가 이러한 메서드를 사용할 수 없음을 의미합니다. 그리고 현재 적용 범위로 볼 때 이러한 메서드는 현재 SqlMembershipProvider에서만 사용되므로 이러한 메서드 수정자를 protected로 변경해야 한다고 생각합니다.
2. 멤버십 정적 클래스
위에서 언급한 것처럼 일반적인 상황에서는 MembershipProvider 추상화를 직접 사용하지 않습니다. 이는 실제 멤버십 서비스 클래스를 인스턴스화하는 방법에 대한 문제와 일반적으로 객체의 구성 및 인스턴스화를 포함하기 때문입니다. 어려운 질문이고, 초보자에게는 마스터하기가 쉽지 않습니다. .NET 프레임워크에서 이 복잡한 관계 계층은 정적 클래스 Membership(정적 클래스)을 통해 보호됩니다. 사용자가 구성 파일, 초기 개체 및 기타 기본 작업을 읽지 못하도록 보호하는 것 외에도 Membership(정적 클래스)은 모든 MembershipProvider를 다시 로드하는 데 중요한 역할을 하므로 사용자가 보다 편리하게 사용할 수 있도록 API가 있습니다. (정적 클래스)는 또한 이러한 메서드를 정적 메서드로 다시 로드하고 사용자가 호출할 수 있도록 MembershipProvider의 기본 API를 기반으로 보다 풍부한 오버로드된 구현을 제공합니다. 이는 UI 레이어에 있든 다른 프로젝트에 있든 직접적으로 지원하므로 System.Web.Security 네임스페이스만 참고하면 세세한 부분은 걱정하지 않고 Membership이 제공하는 다양한 편리함을 누릴 수 있습니다. Membership(정적 클래스)의 프로토타입 정의를 살펴보겠습니다. (모든 구현을 보려면 Lutz Roder의 .NET Reflector를 사용하십시오.)
public static class Membership
...{
// 이벤트
public static event MembershipValidatePasswordEventHandler ValidatingPassword;
// 메소드
static Membership();
public static MembershipUser CreateUser(string 사용자 이름, 문자열 비밀번호);
public static MembershipUser CreateUser(문자열 사용자 이름, 문자열 비밀번호, 문자열 이메일);
public static MembershipUser CreateUser(문자열 사용자 이름, 문자열 비밀번호, 문자열 비밀번호 질문, 문자열 비밀번호 답변, bool isApproved, out MembershipCreateStatus 상태);
public
static MembershipUser CreateUser(문자열 사용자 이름, 문자열 비밀번호, 문자열 이메일, 문자열 비밀번호 질문, 문자열 비밀번호Answer, bool isApproved, 개체 공급자UserKey, out MembershipCreateStatus 상태);
public static bool DeleteUser(stringusername
, bool deleteAllRelatedData);
public static MembershipUserCollectionFindUsersByEmail(string emailToMatch);
public static MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageSize, out int totalRecords);
public static MembershipUserCollection FindUsersByName(string usernameToMatch
;
,
out int totalRecords);public
static int GetNumberOfUsersOnline()
;
public
static MembershipUser GetUser(bool userIsOnline)
; GetUser( 문자열 사용자 이름);
public static MembershipUserGetUser
(개체 공급자UserKey, bool userIsOnline);
public
static string GetUserNameByEmail(string emailToMatch)
;
(MembershipUser 사용자);
public static bool ValidateUser(문자열 사용자 이름, 문자열 비밀번호);
// 속성
public static string ApplicationName ...{ get; }
public static bool EnablePasswordRetrieval ...
{
get
;
static bool IsHashAlgorithmFromMembershipConfig ...{ get; }
public static int MaxInvalidPasswordAttempts ...{ get; }
publicstatic int MinRequiredNonAlphanumericCharacters ...
{ get; }
public static int PasswordAttemptWindow ... { 가져오기; }
공개 정적 문자열 PasswordStrengthRegularExpression ...{ 가져오기
; }
공개 정적 MembershipProviderCollection 공급자 ...{ 가져오기; }
공개
정적 bool RequiresQuestionAndAnswer ...{ 가져오기;
int UserIsOnlineTimeWindow ...{ get }
//
개인 정적 문자열 S_HASHALGORITHMCONFIG
;
ERS
;
개인
정적
정적
S_USERISONLINETIMEWINDOW
;
}
그러고 보니 몇 마디 해야겠습니다. Membership(정적 클래스) 구현 코드를 살펴보는 과정에서 모든 Membersip API 오버로드가 Provider 속성의 메서드를 호출하게 된다는 것을 알 수 있습니다. 이 속성의 유형은 MembershipProvider 유형입니다. MembershipProvider의 중요한 역할을 이해해 봅시다. web.config에 구성된 모든 멤버십 서비스 클래스를 가져오는 Providers 속성도 있습니다. 그것들은 모두 정적 속성이지만 어떻게 인스턴스화됩니까? Membership.Initialize() 메서드를 호출하면 이 두 속성이 호출될 때마다 이 메서드가 호출되어 Membership에서 제공하는 서비스 클래스가 초기화되었는지 여부를 확인합니다. 초기화되지 않은 경우 구성 서비스 클래스가 호출되어 구성을 읽습니다. . 초기화할 내용입니다. 이 시점에서는 왜 우리가 이 기능을 사용하기 쉬운지 이해하는 것이 어렵지 않을 것입니다!
3. SqlMembershipProvider 소개 및 사용법 구성
위의 소개를 통해 기본적으로 Membership의 전반적인 구조를 이해할 수 있을 것입니다. (아직 구현 코드를 분석하기 위해 Lutz Roder의 .NET Reflector를 열지 않았거나 추상 클래스의 역할을 아직 이해하지 못했을 수 있습니다.) 무슨 일이 있어도 우리의 궁극적인 목표는 그것을 사용하는 방법을 배우는 것입니다.
그 전에 먼저 .NET 프레임워크에서 제공되는 두 개의 MembershipProvider 구현 클래스인 ActiveDirectoryMembershipProvider 및 SqlMembershipProvider를 소개하고 싶습니다. (이 두 클래스를 어떻게 알 수 있습니까? 상속된 모든 클래스는 MembershipProvider의 파생 유형에서 볼 수 있습니다.) 전자는 기본 사용자 제공 Active Directory에서의 관리(연습해본 적은 없음)와 후자는 우리가 가장 자주 사용하는 SqlServer 기반의 사용자 관리 구현입니다.
이제 사용법을 소개할 차례입니다. 실제로 이에 대한 기사는 이미 정원에 나와 있으므로((번역) ASP.NET 2.0에서 멤버십 사용 방법) 더 이상 설명을 낭비하지 않겠습니다. 하지만 여기서는 가장 직접적으로 학습하고 참고할 수 있는 방법을 알려드리고 싶습니다. 시스템 디스크에서 machine.config를 찾아 열고 AspNetSqlMembershipProvider 노드를 찾아 볼 수 있는지 확인하십시오. 실제로 이것은 가장 기본적인 Membership 구성이지만 defaultProvider 특성의 사양이 부족합니다. 로그인 컨트롤을 사용할 수 있으므로 사용자 로그인 확인을 위해 코드를 사용할 필요가 없습니다. 믿을 수 없다면 시도해 볼 수 있습니다. (Forms 검증에 대해서는 여기서는 소개하지 않겠습니다. 관련 내용을 참고하시면 됩니다. SqlMembershipProvider에 대한 자세한 내용은 MSDN을 참고하시기 바랍니다.)
4. MembershipProvider, 기타 기존 MembershipProvider 리소스를 사용자 정의하는 방법
그러면 MembershipProvider를 어떻게 사용자 정의합니까? 사실, 이미 Membership의 구조를 이해하고 계시다면 어렵지 않다고 생각합니다. 그러나 완전한 MembershipProvider를 작성하는 것은 여전히 일정량의 작업과 어려움을 고려하면 됩니다. 우리에게는 SqlMembershipProvider와 같은 기존 공급자를 확장할 수 있는 더 많은 장소가 있을 수 있습니다. 실제로 이것은 매우 간단합니다. SqlMembershipProvider에서 상속한 다음(조용히 말씀드리자면, 초기화 메서드의 구성 매개변수에 저장되는 것은 공급자의 해당 구성 섹션의 속성 이름과 값입니다) 필요한 메소드를 다시 작성하십시오. 이를 사용할 때 공급자 구성 섹션에서 유형 값을 클래스 이름으로 변경하면 문제가 없습니다.
마지막으로, mysql, Oracle 등과 같은 다양한 환경의 MembershipProvider가 이미 시장에 많이 있습니다. Mysql의 구현은 다음과 같습니다. http://www.codeproject.com/aspnet/mysqlmembershipprovider.asp Google에서 더 다양한 구현을 찾을 수 있습니다.
네, 너무 많은 말을 했네요. 이 블로그를 읽으시느라 고생하신 분들께 도움이 되었으면 좋겠습니다^_*