次の方法で共有


メンバシップ プロバイダの実装

更新 : 2007 年 11 月

ASP.NET メンバシップは、ASP.NET アプリケーションでさまざまなメンバシップ プロバイダを簡単に使用できるように設計されています。.NET Framework に含まれる付属のメンバシップ プロバイダを使用するか、独自のプロバイダを実装できます。

カスタムのメンバシップ プロバイダを作成する 2 つの主な理由を次に示します。

  • .NET Framework に付属するメンバシップ プロバイダがサポートしないデータ ソース (Oracle データベースなど) にメンバシップ情報を格納する必要がある。

  • .NET Framework に付属のプロバイダが使用するデータベース スキーマとは異なるデータベース スキーマを使用してメンバシップ情報を管理する必要がある。この一般的な例としては、企業または Web サイトの SQL Server データベースに既に存在するメンバシップ データが挙げられます。

必要なクラス

メンバシップ プロバイダを実装するには、System.Web.Security 名前空間から MembershipProvider 抽象クラスを継承するクラスを作成します。MembershipProvider 抽象クラスは System.Configuration.Provider 名前空間から ProviderBase 抽象クラスを継承するため、ProviderBase クラスの必須メンバも実装する必要があります。ProviderBase 抽象クラスおよび MembershipProvider 抽象クラスから実装する必要がある必須のプロパティおよびメソッドの一覧と、それぞれの説明を次の表に示します。各メンバの実装については、「サンプル メンバシップ プロバイダの実装」のコードを参照してください。

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 パスワードは、データベースへの格納時に一方向のハッシュ アルゴリズムとランダム生成された salt 値を使用してハッシュされます。パスワードの検証では、パスワードはデータベースの salt 値を使用してハッシュされて検査されます。ハッシュされたパスワードは取得できません。

MembershipProvider クラスの EncryptPassword 仮想メソッドおよび DecryptPassword 仮想メソッドを使用してパスワード値を暗号化および復号化するか、または独自の暗号化コードを記述できます。MembershipProvider クラスの EncryptPassword 仮想メソッドおよび DecryptPassword 仮想メソッドを使用する場合、Encrypted パスワードは、構成の machineKey 要素 (ASP.NET 設定スキーマ) に指定されているキー情報を使用して暗号化されます。

このプロパティは読み取り専用です。

MaxInvalidPasswordAttempts プロパティ

構成ファイル (Web.config) に指定された Integer 値。

MaxInvalidPasswordAttempts は、メンバシップ ユーザーのパスワードまたはパスワードの解答を繰り返し推測しようとする望ましくないソースに対して防御するため、PasswordAttemptWindow と連動して機能します。PasswordAttemptWindow によって指定された時間 (分単位) 内にメンバシップ ユーザーに提供された無効なパスワードまたはパスワードの質問の数が MaxInvalidPasswordAttempts を超えた場合、IsLockedOut プロパティを true に設定することによりメンバシップ ユーザーがロックアウトされます。ユーザーのロックを解除するには、UnlockUser メソッドを使用します。MaxInvalidPasswordAttempts に達する前に有効なパスワードまたはパスワードの解答が提供された場合、無効な試行の数を追跡するカウンタがゼロにリセットされます。

RequiresQuestionAndAnswer プロパティを false に設定すると、無効なパスワードの解答の試行は追跡されません。

無効なパスワードおよびパスワードの解答の試行は、ValidateUser メソッド、ChangePassword メソッド、ChangePasswordQuestionAndAnswer メソッド、GetPassword メソッド、および ResetPassword メソッドで追跡されます。

このプロパティは読み取り専用です。

PasswordAttemptWindow プロパティ

構成ファイル (Web.config) に指定された Integer 値。

説明については、MaxInvalidPasswordAttempts プロパティの説明を参照してください。

このプロパティは読み取り専用です。

ApplicationName プロパティ

構成ファイル (Web.config) に指定されているメンバシップ情報を使用するアプリケーションの名前。ApplicationName は関連するユーザー情報と共にデータ ソースに格納され、その情報について照会するときに使用されます。詳細については、このトピックで後述する「ApplicationName」を参照してください。

この読み取り/書き込みが可能なプロパティは、明示的に指定しない場合、既定で ApplicationPath に設定されます。

CreateUser メソッド

新しいユーザーの名前、パスワード、および電子メール アドレスを入力として受け取り、アプリケーションの新しいユーザーをデータ ソースに挿入します。CreateUser メソッドは、この新しく作成されたユーザーの情報が設定された MembershipUser オブジェクトを返します。また、CreateUser メソッドは MembershipCreateStatus 値を返す out パラメータも定義します (Visual Basic では、ByRef を使用できます)。この値は、ユーザーが正常に作成されたかどうか、またはユーザーが正常に作成されなかった理由を示します。

MembershipValidatePasswordEventHandler が指定されている場合、CreateUser メソッドは ValidatingPassword イベントを発生させ、イベントの結果に基づいてユーザーの作成操作を続行またはキャンセルします。OnValidatingPassword 仮想メソッドを使用すると、指定した MembershipValidatePasswordEventHandler を実行できます。

UpdateUser メソッド

ユーザー情報が設定された MembershipUser オブジェクトを入力として受け取り、指定された値でデータ ソースを更新します。

DeleteUser メソッド

ユーザーの名前を入力として受け取り、そのユーザーの情報をデータ ソースから削除します。ユーザーが正常に削除された場合、DeleteUser メソッドは true を返します。それ以外の場合は false を返します。ロールやプロファイル情報など、ユーザーに関連する情報も削除されているかどうかを示すために、追加の Boolean パラメータが用意されています。

ValidateUser メソッド

ユーザー名とパスワードを入力として受け取り、データ ソースの値と一致するかどうかを確認します。ユーザー名およびパスワードが一致する場合、ValidateUser メソッドは true を返します。それ以外の場合は false を返します。

GetUser メソッド

一意のユーザー ID およびこのユーザーが現在オンラインであることを示すユーザーの 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 がスローされます。ResetPassword メソッドは RequiresQuestionAndAnswer プロパティの値もチェックします。RequiresQuestionAndAnswer プロパティが true の場合、ResetPassword メソッドは指定した解答パラメータ値とデータ ソースに格納されたパスワードの解答が一致しているかどうかをチェックします。一致しない場合は、MembershipPasswordException がスローされます。

MembershipValidatePasswordEventHandler が指定されている場合、ResetPassword メソッドは ValidatingPassword イベントを発生させて新しく生成されたパスワードを検証し、イベントの結果に基づいてパスワードのリセット操作を続行またはキャンセルします。OnValidatingPassword 仮想メソッドを使用すると、指定した MembershipValidatePasswordEventHandler を実行できます。

GetPassword メソッド

ユーザー名とパスワードの解答を入力として受け取り、そのユーザーのパスワードをデータ ソースから取得して、パスワードを string として返します。

GetPassword を使用すると、任意の操作を実行する前に EnablePasswordRetrieval プロパティが true に設定されます。EnablePasswordRetrieval プロパティが false の場合、ProviderException がスローされます。

GetPassword メソッドは RequiresQuestionAndAnswer プロパティの値もチェックします。RequiresQuestionAndAnswer プロパティが true の場合、GetPassword メソッドは指定した解答パラメータ値とデータ ソースに格納されたパスワードの解答が一致しているかどうかをチェックします。一致しない場合は、MembershipPasswordException がスローされます。

GetUserNameByEmail メソッド

電子メール アドレスを入力として受け取り、指定した email パラメータ値とその電子メール アドレスが一致した場合に、データ ソースの最初のユーザー名を返します。

電子メール アドレスが一致するユーザー名が見つからない場合は、空の文字列が返されます。

特定の電子メール アドレスと一致するユーザー名が複数見つかった場合は、最初のユーザー名だけが返されます。

ChangePassword メソッド

ユーザー名、現在のパスワード、および新しいパスワードを入力として受け取り、指定されたユーザー名と現在のパスワードが有効な場合、データ ソース内のパスワードを更新します。パスワードが正常に更新された場合、ChangePassword メソッドは true を返します。それ以外の場合は false を返します。

MembershipValidatePasswordEventHandler が指定されている場合、ChangePassword メソッドは ValidatingPassword イベントを発生させ、イベントの結果に基づいてパスワードの変更操作を続行またはキャンセルします。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'

カスタム メンバ

ProviderBase 抽象クラスおよび MembershipProvider 抽象クラスが提供していない追加機能を使用するには、メンバシップ プロバイダ インターフェイスの拡張が必要となる場合があります。メンバシップ プロバイダに追加するすべてのパブリック メンバには、Membership クラスの Provider プロパティまたは Providers プロパティを使用してアクセスできます。

この例としては、IsLockedOut プロパティを true に設定する LockUser メソッドが考えられます。次の例は、Provider プロパティをキャストする方法を示します。このプロパティは、カスタムの LockUser メソッドを呼び出すためのカスタム プロバイダの型として、アプリケーションの既定のメンバシップ プロバイダを公開します。

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 Web サイトのセキュリティ