ロール プロバイダの実装
更新 : 2007 年 11 月
ASP.NET ロール管理を使用すると、ASP.NET アプリケーションで多数の異なる種類のプロバイダを簡単に使用できます。.NET Framework に用意されているプロファイル プロバイダを使用することも、独自のプロバイダを実装することもできます。
カスタム ロール プロバイダを作成する理由は主に 2 つあります。
.NET Framework に付属するロール プロバイダがサポートしていないデータ ソース (Oracle データベースなど) にロール情報を格納する必要があるため。
.NET Framework に付属のプロバイダが使用するデータベース スキーマとは異なるデータベース スキーマを使用してロール情報を管理する必要があるため。この一般的な例としては、企業または Web サイトの SQL Server データベースに既に存在している承認データが挙げられます。
必要なクラス
ロール プロバイダを実装するには、System.Web.Security 名前空間から RoleProvider 抽象クラスを継承するクラスを作成します。RoleProvider 抽象クラスは、System.Configuration.Provider 名前空間から ProviderBase 抽象クラスを継承します。結果として、ProviderBase クラスの必須メンバも同様に実装する必要があります。ProviderBase と RoleProvider 抽象クラスから実装する必要のある必須プロパティとメソッド、およびそれぞれの説明を次の表に示します。各メンバの実装については、「サンプル ロール プロバイダの実装」のコードを参照してください。
ProviderBase メンバ
メンバ |
説明 |
---|---|
Initialize メソッド |
プロバイダの名前および構成設定の NameValueCollection を入力として受け取ります。構成ファイル (Machine.config または Web.config) に指定されている実装固有の値とオプションを含むプロバイダ インスタンスのプロパティ値を設定するために使用されます。 |
RoleProvider メンバ
メンバ |
説明 |
---|---|
ApplicationName プロパティ |
構成ファイル (Web.config) に指定されているロール情報を使用するアプリケーションの名前。ApplicationName は関連するユーザー情報と共にデータ ソースに格納され、ユーザー情報について照会するときに使用されます。詳細については、このトピックで後述する「ApplicationName」を参照してください。 このプロパティは読み書き可能で、明示的に指定しない場合、既定で ApplicationPath に設定されます。 |
AddUsersToRoles メソッド |
ユーザー名のリストとロール名のリストを入力として受け取り、指定されたユーザーを、構成済みの ApplicationName のデータ ソースで指定されたロールに関連付けます。 指定されたロール名またはユーザー名が構成済みの ApplicationName に存在しない場合、ProviderException をスローする必要があります。 指定されたユーザー名またはロール名が空の文字列のときは、ArgumentException をスローし、指定されたユーザー名またはロール名が null (Visual Basic では Nothing) のときは、ArgumentNullException をスローする必要があります。 データ ソースがトランザクションをサポートしている場合は、1 回のトランザクション内に各追加操作を含めて実行し、追加操作が失敗したらトランザクションをロールバックして例外をスローする必要があります。 |
CreateRole メソッド |
ロール名を入力として受け取り、指定されたロールを、構成済みの ApplicationName のデータ ソースに追加します。 指定されたロール名が構成済みの ApplicationName に既に存在する場合は、ProviderException をスローする必要があります。 指定されたロール名が空の文字列である場合、コンマを含む場合、またはデータ ソースで許可される最大長を超える場合は、ArgumentException をスローし、指定されたロール名が null (Visual Basic の場合は Nothing) である場合は、ArgumentNullException をスローする必要があります。 |
DeleteRole メソッド |
ロール名とブール値を入力として受け取ります。ブール値はロールに関連付けられているユーザーがまだ存在する場合に例外をスローするかどうかを示します。DeleteRole は、構成済みの ApplicationName のデータ ソースから指定されたロールを削除します。 throwOnPopulatedRole パラメータが true で、ロール名パラメータによって指定されるロールに 1 つ以上のメンバがある場合は、ProviderException をスローし、ロールは削除しないようにする必要があります。throwOnPopulatedRole パラメータが false の場合は、空かどうかにかかわらずロールを削除します。 データ ソースからロールを削除する際は、構成済みの ApplicationName について、ユーザー名と削除するロールとの関連付けも必ず削除する必要があります。 指定されたロール名が存在しない、または空の文字列である場合は、ArgumentException をスローする必要があります。指定されたロール名が null (Visual Basic では Nothing) である場合、ArgumentNullException をスローする必要があります。 |
FindUsersInRole メソッド |
検索するロール名とユーザー名を入力として受け取り、構成済みの ApplicationName について、指定された usernameToMatch に一致するユーザー名を含むロール内のユーザー リストを返します。データ ソースによっては、ワイルドカードがサポートされます。ユーザーは、ユーザー名のアルファベット順に返されます。 指定されたロール名がデータ ソースに存在しない場合は、ProviderException をスローすることをお勧めします。 |
GetAllRoles メソッド |
データ ソースからロール名のリストを返します。指定された ApplicationName のロールのみが取得されます。 構成済みの ApplicationName にロールが存在しない場合は、要素なしの文字列配列を返す必要があります。 |
GetRolesForUser メソッド |
ユーザー名を入力として受け取り、データ ソースから、指定されたユーザー名が関連付けられているロール名を返します。構成済みの ApplicationName のロールのみが取得されます。 構成済みの ApplicationName に指定されたユーザーのロールが存在しない場合は、要素なしの文字列配列を返す必要があります。 指定されたユーザー名が空の文字列である場合、ArgumentException をスローする必要があります。指定されたユーザー名が null (Visual Basic では Nothing) である場合、ArgumentNullException をスローする必要があります。 |
GetUsersInRole メソッド |
ロール名を入力として受け取り、データ ソースから、ロールに関連付けられているユーザー名を返します。構成済みの ApplicationName のロールのみが取得されます。 指定されたロール名が構成済みの ApplicationName に存在しない場合、ProviderException をスローする必要があります。 構成済みの ApplicationName について、指定されたロールに関連付けられているユーザーが存在しない場合は、要素なしの文字列配列を返す必要があります。 指定されたロール名が空の文字列である場合、コンマを含む場合、またはデータ ソースで許可されるロール名の最大長を超える場合は、ArgumentException をスローする必要があります。指定されたロール名が null (Visual Basic では Nothing) である場合、ArgumentNullException をスローする必要があります。 |
IsUserInRole メソッド |
ユーザー名とロール名を入力として受け取り、構成済みの ApplicationName について、現在ログオンしているユーザーがデータ ソースでロールに関連付けられているかどうかを確認します。 指定されたロール名またはユーザー名が構成済みの ApplicationName に存在しない場合、ProviderException をスローする必要があります。 指定されたユーザー名またはロール名が空の文字列のときは、ArgumentException をスローし、指定されたユーザー名またはロール名が null (Visual Basic では Nothing) のときは、ArgumentNullException をスローする必要があります。 |
RemoveUsersFromRoles メソッド |
ユーザー名のリストとロール名のリストを入力として受け取り、構成済みの ApplicationName のデータ ソースで、指定されたロールとユーザーの関連付けを削除します。 指定されたロール名またはユーザー名が構成済みの ApplicationName に存在しない場合、ProviderException をスローする必要があります。 指定されたユーザー名またはロール名が空の文字列のときは、ArgumentException をスローし、指定されたユーザー名またはロール名が null (Visual Basic では Nothing) のときは、ArgumentNullException をスローする必要があります。 データ ソースがトランザクションをサポートしている場合は、1 回のトランザクション内に各削除操作を含めて実行し、削除操作が失敗したらトランザクションをロールバックして例外をスローする必要があります。 |
RoleExists メソッド |
ロール名を入力として受け取り、構成済みの ApplicationName について、データ ソースにロール名が存在するかどうかを決定します。 指定されたロール名が存在しない、または空の文字列である場合は、ArgumentException をスローする必要があります。指定されたロール名が null (Visual Basic では Nothing in Visual Basic) である場合、ArgumentNullException をスローすることをお勧めします。 |
ApplicationName
ロール プロバイダは、アプリケーションごとに一意のロール情報を格納します。これによって、重複するユーザー名が使用された場合でも、複数の ASP.NET アプリケーションが競合することなく同じデータ ソースを使用できます。また、同じ ApplicationName を指定すると、複数の ASP.NET アプリケーションが同じロール データ ソースを使用できます。
ロール プロバイダはアプリケーションごとに一意のロール情報を格納するため、データ スキーマだけでなく、クエリや更新にもアプリケーション名が含まれていることを確認する必要があります。たとえば、クエリに確実に ApplicationName を含めて、データベースからロール名を検索するには、次のコマンドを使用します。
SELECT Rolename FROM Roles
WHERE Rolename = 'Administrators' AND ApplicationName = 'MyApplication'
スレッド セーフ
アプリケーションの構成で指定された個々のロール プロバイダごとに、ASP.NET は、1 つの HttpApplication オブジェクトによってサービスが提供されるすべての要求に対して使用される単一のロール プロバイダ インスタンスを作成します。その結果、複数の要求が同時に実行される場合があります。ASP.NET では、プロバイダの呼び出しに対してスレッド セーフを保証しません。したがって、開発者が記述するプロバイダ コードはスレッド セーフである必要があります。たとえば、データベースへの接続を作成したり編集するためにファイルを開いたりする操作は、呼び出される側のメンバ (AddUsersToRoles など) 内で実行する必要があります。Initialize メソッドが呼び出されたときにファイルまたはデータベース接続を開くのは安全ではありません。