概要: asp.net 2.0 の Membership コンポーネントは、開発者がユーザー管理とユーザー検証を実行するための、非常にシンプルで使いやすいインターフェイスのセットを提供します。この記事では、その実装原理を簡単に分析し、その正しい使用方法と拡張方法を紹介します。
1. MembershipProvider 抽象クラス
Membership を使用する場合、多くの場合、このクラスを直接使用することはありません。 MembershipProvider クラスは、いくつかの抽象メソッドと抽象属性を定義します。これらのメソッドと属性が Membership インターフェイスの基本仕様を構成し、.NET Framework 内で Membership を使用する関数はすべてこの型を通じて呼び出されます。継承されたクラスは、これらのインターフェイスを実装することにより、さまざまな環境でユーザー管理機能を提供します。Membership フレームワーク自体には影響を与えません。MembershipProvider のプロトタイプ定義を見てみましょう。
public abstract class MembershipProvider : ProviderBase
...{
// イベント
public event MembershipValidatePasswordEventHandler ValidatingPassword;
// メソッド
protected MembershipProvider();
public abstract bool ChangePassword(string username, string oldPassword, string newPassword);
public
abstract bool ChangePasswordQuestionAndAnswer(string username, string newPasswordQuestion, string newPasswordAnswer);
パスワード、文字列電子メール、文字列
パスワード質問、文字列パスワード回答、ブール isApproved、オブジェクト ProviderUserKey、out MembershipCreateStatus ステータス
)
;
(文字列パス、int パスワード形式、文字列ソルト);
protected 仮想 byte[] EncryptPassword(byte[] パスワード);
public abstract MembershipUserCollection FindUsersByEmail
(string emailToMatch, int pageIndex, int pageSize, out int totalRecords);
, int pageIndex, int pageSize, out int totalRecords);
内部文字
列 GenerateSalt();
public
abstract MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords);
答え);
パブリック抽象 MembershipUser GetUser(オブジェクトプロバイダーユーザー
キー, ブール userIsOnline);
パブリック抽象
メンバーシップユーザー GetUser(文字列ユーザー名, ブール userIsOnline, ブール throwOnError);
protected virtual void OnValidatingPassword(ValidatePasswordEventArgs e);
public abstract string ResetPassword(string username, stringanswer)
;
public
abstract bool UnlockUser(string userName);
public abstract bool ValidateUser(string ユーザー名、string パスワード);
// プロパティ
public
abstract string ApplicationName ...{ get; }
public abstract bool EnablePasswordRetrieval ...
{ get
;
abstract int MinRequiredNonAlphanumericCharacters ...{ get; }
public abstractint
MinRequiredPasswordLength ...{ get;
}public
abstract MembershipPasswordFormat PasswordFormat ...{ get; }
{ get; }
パブリック抽象ブール RequiresQuestionAndAnswer ...{ 取得 }
パブリック抽象ブール RequiresUniqueEmail ...{ 取得;
// フィールド
private
MembershipValidatePasswordEventHandler _EventHandler
;
修飾子 external は、パスワードの暗号化、復号化、検証に使用される、パスワードの補助メソッドであるいくつかのメソッドです。しかし、ここでの設計にいくつかの問題があるようです。これらのメソッドを内部スコープとして定義するのは少し不適切なようです。これらのメソッドは再利用できるように基本クラスで定義されていますが、効果の観点からはこれは問題です。内部メンバーはこのアセンブリ内でのみ使用できるため (通常の状況では、リフレクションなどの他のメソッドは含まれません)、これは、独自の拡張 MembershipProvider がこれらのメソッドを使用できないことを意味します。また、現在の適用範囲から判断すると、これらのメソッドは現在 SqlMembershipProvider でのみ使用されているため、これらのメソッド修飾子を protected に変更する必要があると思います。
2. メンバーシップ静的クラス
上で述べたように、通常の状況では、MembershipProvider 抽象化を直接使用しません。これは、実際の Membership サービス クラスをインスタンス化する方法の問題が関係し、一般にオブジェクトの構成とインスタンス化が関係するためです。これらはすべて相対的なものです。難しい質問であり、初心者にとってはマスターするのは簡単ではありません。 .NET Framework では、この複雑な関係の層は静的クラスのメンバーシップ (静的クラス) によって保護されます。メンバーシップ (静的クラス) は、ユーザーが構成ファイル、初期オブジェクト、その他の基本的なタスクを読み取れないように保護するだけでなく、すべての MembershipProvider を再ロードする際にも重要な役割を果たします。そのため、ユーザーがより便利に使用できるようにするための API が用意されています。 (静的クラス) は、これらのメソッドを静的メソッドとして再ロードし、ユーザーが呼び出すための MembershipProvider の基本 API に基づいた、より豊富なオーバーロードされた実装を提供します。これは、UI 層であっても他のプロジェクトであっても直接サポートされており、System.Web.Security 名前空間を参照するだけで、詳細を気にすることなく Membership によって提供されるさまざまな利便性を享受できます。 Membership (静的クラス) のプロトタイプ定義を見てみましょう: (すべての実装を表示するには、Lutz Roder の .NET Reflector を使用します。)
public static class Membership
...{
// Events
public static event MembershipValidatePasswordEventHandler ValidatingPassword;
// メソッド
static Membership();
public static MembershipUser CreateUser(string ユーザー名
, string パスワード, string メールアドレス); public static MembershipUser CreateUser
(string ユーザー名, string パスワード, string メールアドレス)
;パスワード質問、文字列パスワード
回答、ブール isApproved、out MembershipCreateStatus ステータス); public static MembershipUser CreateUser(string ユーザー名、文字列パスワード、文字列電子メール、文字列パスワード質問、文字列パスワード回答、ブール isApproved、オブジェクト ProviderUserKey、out MembershipCreateStatus ステータス)
;
public static bool DeleteUser(stringusername
, bool deleteAllManyData);
public static MembershipUserCollectionFindUsersByEmail(string emailToMatch)
;
public static MembershipUserCollection FindUsersByName(string usernameToMatch
;
,
out int totalRecords);public
static int GetNumberOfUser()
;
public
static
MembershipUser GetUser(object ProviderUserKey);
GetUser( string ユーザー名);
public
static MembershipUserGetUser
(object projectUserKey, bool userIsOnline);
public static string GetUserNameByEmail(string emailToMatch)
;
(MembershipUser ユーザー);
public static bool ValidateUser(string ユーザー名、string パスワード);
// プロパティ
public static string ApplicationName ...{ get; }
public static bool EnablePasswordRetrieval ...
{ get
;
}
static bool IsHashAlgorithmFromMembershipConfig ...{ get; }
public static int MaxInvalidPasswordAttempts ...{ get;
}
public
static int MinRequiredPasswordLength ...{ get; }
{ get; }
public static string PasswordStrength RegularExpression ...{ get; }
public static
MembershipProviderCollection Providers ...{ get; }
public
static bool RequiresQuestionAndAnswer ...{ get
;int UserIsOnlineTimeWindow ...{ 取得 }
// フィールド
private static char[] punctuations;
privatestatic string s_HashAlgorithmType
s_Initialized
;
private
static MembershipProvider s_Provider
; ;
プライベート静的 int s_UserIsOnlineTimeWindow
;
}
そうは言っても、少し言わなければなりません。 Membership (静的クラス) 実装コードを確認する過程で、すべての Membersip API オーバーロードが最終的に属性 Provider のメソッドを呼び出していることがわかります。この属性の型は MembershipProvider 型であることがわかります。 MembershipProvider の重要な役割を理解しましょう。また、web.config で構成されているすべてのメンバーシップ サービス クラスを取得するための Providers 属性もあります。これらはすべて静的プロパティですが、どのようにインスタンス化されるのでしょうか? Membership.Initialize() メソッドを呼び出すことにより、これら 2 つのプロパティが呼び出されるたびに、このメソッドが呼び出され、Membership によって提供されるサービス クラスが初期化されているかどうかが判断されます。初期化されていない場合は、構成サービス クラスが呼び出され、構成が読み取られます。 . 初期化するコンテンツ。この時点では、なぜこれが使いやすいのかを理解するのは難しくないかもしれません。
3. SqlMembershipProvider の導入と使用構成
上記の導入で、Membership の全体的な構造を基本的に理解できるはずです。 (まだ行っていない場合は、Lutz Roder の .NET Reflector を開いて実装コードを分析していないか、抽象クラスの役割をまだ理解していない可能性があります)。何はともあれ、私たちの最終目標はその使い方を学ぶことです。
その前に、まず .NET Framework で提供される 2 つの MembershipProvider 実装クラス、ActiveDirectoryMembershipProvider と SqlMembershipProvider を紹介します (これら 2 つのクラスをどのように知っていますか? MembershipProvider の派生型ですべての継承クラスを確認できます。) 前者は、基本的なユーザーを提供します。 Active Directory での管理 (実践したことはありません)、後者は最もよく使用される SqlServer に基づくユーザー管理の実装です。
実際、これについてはすでに庭に記事があるので、これ以上説明しません。しかし、ここではそれを学び、参考にするための最も直接的な方法をお伝えしたいと思います。システム ディスク上で machine.config を見つけて開き、AspNetSqlMembershipProvider ノードを見つけて、それが表示されるかどうかを確認します。実際、これは最も基本的なメンバーシップ構成ですが、この属性を指定した後、defaultProvider 属性の指定が欠落しています。ログイン制御を使用できるため、ユーザーのログイン検証にコードを使用する必要はありません。信じられない場合は、試してみてください。 (フォーム検証については、ここでは紹介しません。関連情報を参照してください。SqlMembershipProvider の詳細については、MSDN を参照してください)。
4. MembershipProvider、その他の既存の MembershipProvider リソースをカスタマイズする方法
では、MembershipProvider をカスタマイズするにはどうすればよいでしょうか?実際、Membership の構造をすでに理解していれば、それは難しくないと思いますが、完全な MembershipProvider を記述するのはまだある程度の作業と困難を伴います。私たちにとって、SqlMembershipProvider などの既存のプロバイダーを拡張する場所がさらに増える可能性があります。実際、これは非常に簡単です。SqlMembershipProvider から継承するだけで済みます (Initialize メソッドの config パラメーターに保存されるのは、プロバイダーの対応する構成セクションの属性名と値です)。必要なメソッドを書き換えます。使用する場合は、プロバイダー構成セクションで、type の値をクラス名に変更すれば問題ありません。
最後に、市場には、mysql、Oracle など、さまざまな環境ですでに多くの MembershipProvider が存在します。 Mysql の実装は次のとおりです: http://www.codeproject.com/aspnet/mysqlmembershipprovider.aspより多くの実装が Google から提供されていると思います。
さて、いろいろ言いましたが、このブログを読んでくださった方のお役に立てれば幸いです^_*。