SQL Server でメンバーシップ スキーマを作成する (VB)

作成者: Scott Mitchell

注意

この記事が作成されて以来、ASP.NET メンバーシップ プロバイダーは ASP.NET Identity に置き換えられました。 この記事の執筆時点で取り上げられたメンバーシップ プロバイダーではなく 、ASP.NET ID プラットフォームを使用するようにアプリを更新することを強くお勧めします。 ASP.NET ID には、ASP.NET メンバーシップ システムに比して、次のような多くの利点があります。

  • パフォーマンスの向上
  • 拡張性とテスト性の向上
  • OAuth、OpenID Connect、および 2 要素認証のサポート
  • クレームベースの ID のサポート
  • ASP.Net Core との相互運用性の向上

コードのダウンロード または PDF のダウンロード

このチュートリアルでは、まず、SqlMembershipProvider を使用するために必要なスキーマをデータベースに追加する手法を調べることから始めます。 その後、スキーマの主要なテーブルを調べ、その目的と重要性について説明します。 このチュートリアルでは、メンバーシップ フレームワークで使用するプロバイダーを ASP.NET アプリケーションに指示する方法について説明します。

はじめに

前の 2 つのチュートリアルでは、フォーム認証を使用して Web サイトの訪問者を識別する方法について説明しました。 フォーム認証フレームワークを使用すると、開発者はユーザーを Web サイトにログインさせ、認証チケットを使用してページアクセス間でユーザーを覚えやすくなります。 FormsAuthenticationクラスには、チケットを生成し、訪問者の Cookie に追加するためのメソッドが含まれています。 はFormsAuthenticationModule、すべての受信要求を調べ、有効な認証チケットを持つ要求に対して、 オブジェクトと オブジェクトをFormsIdentity作成して現在の要求に関連付けますGenericPrincipal。 フォーム認証は、ログイン時に訪問者に認証チケットを付与し、後続の要求でそのチケットを解析してユーザーの ID を判断するためのメカニズムにすぎません。 Web アプリケーションでユーザー アカウントをサポートするには、引き続きユーザー ストアを実装し、資格情報の検証、新しいユーザーの登録、その他のユーザー アカウント関連タスクの無数の機能を追加する必要があります。

ASP.NET 2.0 より前は、開発者はこれらすべてのユーザー アカウント関連のタスクを実装する必要がありました。 幸いなことに、ASP.NET チームはこの欠点を認識し、ASP.NET 2.0 でメンバーシップ フレームワークを導入しました。 メンバーシップ フレームワークは、コア ユーザー アカウント関連のタスクを実行するためのプログラムによるインターフェイスを提供する、.NET Framework内のクラスのセットです。 このフレームワークは プロバイダー モデルの上に構築されており、開発者はカスタマイズされた実装を標準化された API にプラグインできます。

セキュリティの基本と ASP.NET サポートのチュートリアルで説明したように、.NET Frameworkには 2 つの組み込みのメンバーシップ プロバイダーと SqlMembershipProviderActiveDirectoryMembershipProvider付属しています。 その名前が示すように、 SqlMembershipProvider は Microsoft SQL Server データベースをユーザー ストアとして使用します。 アプリケーションでこのプロバイダーを使用するには、ストアとして使用するデータベースをプロバイダーに指示する必要があります。 ご想像のとおり、 では SqlMembershipProvider 、ユーザー ストア データベースに特定のデータベース テーブル、ビュー、ストアド プロシージャが必要です。 この予期されるスキーマを選択したデータベースに追加する必要があります。

このチュートリアルでは、まず、 を使用 SqlMembershipProviderするために必要なスキーマをデータベースに追加する手法を調べることから始めます。 その後、スキーマの主要なテーブルを調べ、その目的と重要性について説明します。 このチュートリアルでは、メンバーシップ フレームワークで使用するプロバイダーを ASP.NET アプリケーションに指示する方法について説明します。

それでは作業を始めましょう。

手順 1: ユーザー ストアを配置する場所を決定する

ASP.NET アプリケーションのデータは、通常、データベース内の多数のテーブルに格納されます。 データベース スキーマを SqlMembershipProvider 実装するときは、アプリケーション データと同じデータベースにメンバーシップ スキーマを配置するか、代替データベースに配置するかを決定する必要があります。

次の理由から、アプリケーション データと同じデータベースにメンバーシップ スキーマを見つけることをお勧めします。

  • 1 つのデータベースにデータがカプセル化されているアプリケーションの保守性は、2 つの個別のデータベースを持つアプリケーションよりも、理解、保守、デプロイが容易です。
  • アプリケーション テーブルと同じデータベース内のメンバーシップ関連テーブルを検索することで、リレーショナル整合性は、メンバーシップ関連テーブルの主キーと関連するアプリケーション テーブルの間に外部キー制約を確立できます。

ユーザー ストアとアプリケーション データを個別のデータベースに分離するのは、それぞれが別々のデータベースを使用する複数のアプリケーションがあるが、共通のユーザー ストアを共有する必要がある場合にのみ意味があります。

データベースの作成

2 番目のチュートリアルではまだデータベースを必要としていないため、作成しているアプリケーション。 ただし、ユーザー ストアには必要です。 1 つを作成し、プロバイダーに必要なスキーマを SqlMembershipProvider 追加します (手順 2 を参照)。

注意

このチュートリアル シリーズでは、Microsoft SQL Server 2005 Express Edition データベースを使用して、アプリケーション テーブルとスキーマをSqlMembershipProvider格納します。 この決定は、2 つの理由で行われました。1 つ目は、コストが無料であるためです。Express Edition は、SQL Server 2005 の最も読みやすくアクセス可能なバージョンです。2 つ目は、SQL Server 2005 Express Edition データベースを Web アプリケーションにApp_Data直接配置できますフォルダーを使用すると、データベースと Web アプリケーションを 1 つの ZIP ファイルにパッケージ化し、特別なセットアップ手順や構成オプションなしで再デプロイできます。 Express Edition 以外のバージョンのSQL Serverを使用する場合は、自由にお使いいただけます。 手順は実質的に同じです。 スキーマはSqlMembershipProvider、Microsoft SQL Server 2000 以降の任意のバージョンで動作します。

ソリューション エクスプローラーからフォルダーを右クリックし、[新しい項目のApp_Data追加] を選択します。 (プロジェクトにフォルダーが表示App_Dataされない場合は、ソリューション エクスプローラーでプロジェクトを右クリックし、[フォルダーの追加] ASP.NET 選択して 選択App_Dataします)。[新しい項目の追加] ダイアログ ボックスで、 という名前SecurityTutorials.mdfの新しいSQL Databaseを追加することを選択します。 このチュートリアルでは、このデータベースにスキーマを SqlMembershipProvider 追加します。以降のチュートリアルでは、アプリケーション データをキャプチャするための追加のテーブルを作成します。

App_Data フォルダーに新しい名前付きSQL Database SecurityTutorials.mdf データベースを追加する

図 1: 名前付きSecurityTutorials.mdfデータベースの新しいSQL DatabaseをApp_Dataフォルダーに追加する (フルサイズの画像を表示する をクリックします)

フォルダーにデータベースをApp_Data追加すると、データベース エクスプローラー ビューにデータベースが自動的に含まれます。 (非 Express Edition バージョンの Visual Studio では、データベース エクスプローラーはサーバー エクスプローラーと呼ばれます)。[データベース] エクスプローラーに移動し、追加SecurityTutorialsしたばかりのデータベースを展開します。 [データベース エクスプローラー] が画面に表示されない場合は、[表示] メニューの [データベース エクスプローラー] を選択するか、Ctrl + Alt + S キーを押します。 図 2 に示すように、 SecurityTutorials データベースは空で、テーブルもビューもストアド プロシージャも含まれません。

SecurityTutorials データベースは現在空です

図 2: データベースは SecurityTutorials 現在空です (フルサイズの画像を表示する 場合はクリックします)

手順 2: データベースへのSqlMembershipProviderスキーマの追加

には SqlMembershipProvider 、ユーザー ストア データベースに特定のテーブル、ビュー、ストアド プロシージャのセットをインストールする必要があります。 これらの必要なデータベース オブジェクトは、 ツールをaspnet_regsql.exe使用して追加できます。 このファイルは フォルダーにあります %WINDIR%\Microsoft.Net\Framework\v2.0.50727\

注意

このツールには aspnet_regsql.exe 、コマンド ライン機能とグラフィカル ユーザー インターフェイスの両方が用意されています。 グラフィカル インターフェイスはユーザー フレンドリであり、このチュートリアルで確認します。 コマンド ライン インターフェイスは、ビルド スクリプトや自動テスト シナリオなど、スキーマの SqlMembershipProvider 追加を自動化する必要がある場合に便利です。

このaspnet_regsql.exeツールは、指定したSQL Server データベース ASP.NET アプリケーション サービスを追加または削除するために使用されます。 ASP.NET アプリケーション サービスには、 と SqlRoleProviderのスキーマSqlMembershipProviderと、他の ASP.NET 2.0 フレームワーク用の SQL ベースのプロバイダーのスキーマが含まれます。 ツールに 2 ビットの情報を提供する aspnet_regsql.exe 必要があります。

  • アプリケーション サービスを追加または削除するかどうか、
  • アプリケーション サービス スキーマの追加または削除元のデータベース

データベースの使用を求めるメッセージが表示されたら、 aspnet_regsql.exe データベースが存在するサーバーの名前、データベースに接続するためのセキュリティ資格情報、およびデータベース名を指定するように求められます。 SQL Serverの Express Edition 以外のエディションを使用している場合、この情報は、ASP.NET Web ページを介してデータベースを操作するときに接続文字列を介して提供する必要があるのと同じ情報であるため、既にわかっている必要があります。 ただし、フォルダー内のSQL Server 2005 Express Edition データベースを使用する場合のサーバーとデータベース名のApp_Data決定は、もう少し複雑です。

次のセクションでは、フォルダー内のSQL Server 2005 Express Edition データベースのサーバー名とデータベース名を指定する簡単な方法についてApp_Data説明します。 SQL Server 2005 Express Editionを使用していない場合は、「Application Services のインストール」セクションに進んでください。

フォルダー内のSQL Server 2005 Express Edition データベースのサーバー名とデータベース名のApp_Data決定

このツールを使用 aspnet_regsql.exe するには、サーバー名とデータベース名を知る必要があります。 サーバー名は です localhost\InstanceName。 ほとんどの場合、 InstanceName は です SQLExpress。 ただし、SQL Server 2005 Express Editionを手動でインストールした場合 (つまり、Visual Studio のインストール中に自動的にインストールしなかった場合)、別のインスタンス名を選択した可能性があります。

データベース名は、決定するのが少し複雑です。 フォルダー内の App_Data データベースには、通常、データベース ファイルへのパスと共 にグローバルに一意の識別子 を含むデータベース名があります。 を使用して aspnet_regsql.exeアプリケーション サービス スキーマを追加するには、このデータベース名を決定する必要があります。

データベース名を確認する最も簡単な方法は、SQL Server Management Studioを使用して調べることです。 SQL Server Management Studioは、SQL Server 2005 データベースを管理するためのグラフィカル インターフェイスを提供しますが、SQL Server 2005 の Express Edition には付属していません。 良いニュースは、SQL Server Management Studioの無料の Express Edition をダウンロードできることです。

注意

SQL Server 2005 の Express Edition 以外のバージョンもデスクトップにインストールされている場合は、Management Studio のフル バージョンがインストールされている可能性があります。 完全なバージョンを使用して、Express Edition の以下で説明する手順と同じ手順に従って、データベース名を確認できます。

まず、Visual Studio を閉じて、データベース ファイルに対して Visual Studio によって課されるロックが閉じられるようにします。 次に、SQL Server Management Studioを起動し、データベースにlocalhost\InstanceName接続してSQL Server 2005 Express Editionします。 前に説明したように、インスタンス名が である可能性があります SQLExpress。 [認証] オプションで、[Windows 認証] を選択します。

SQL Server 2005 Express Edition インスタンスに接続する

図 3: SQL Server 2005 Express Edition インスタンスに接続する (フルサイズの画像を表示する をクリックします)

SQL Server 2005 Express Edition インスタンスに接続すると、Management Studio には、データベース、セキュリティ設定、サーバー オブジェクトなどのフォルダーが表示されます。 [データベース] タブを展開すると、データベースがデータベース インスタンスに登録されていないことが表示SecurityTutorials.mdfされます。最初にデータベースをアタッチする必要があります。

[データベース] フォルダーを右クリックし、コンテキスト メニューから [アタッチ] を選択します。 [データベースのアタッチ] ダイアログ ボックスが表示されます。 ここから [追加] ボタンをクリックし、データベースを SecurityTutorials.mdf 参照して [OK] をクリックします。 図 4 は、データベースを選択した後の [データベースのアタッチ] ダイアログ ボックスを SecurityTutorials.mdf 示しています。 図 5 は、データベースが正常にアタッチされた後の Management Studio のオブジェクト エクスプローラーを示しています。

SecurityTutorials.mdf データベースをアタッチする

図 4: データベースをアタッチする SecurityTutorials.mdf (クリックするとフルサイズの画像が表示されます)

SecurityTutorials.mdf データベースがデータベース フォルダーに表示される

図 5: データベースフォルダー SecurityTutorials.mdf にデータベースが表示される (クリックするとフルサイズの画像が表示されます)

図 5 に示すように、データベースの SecurityTutorials.mdf 名前はかなり控えめです。 より覚えやすい (入力しやすい) 名前に変更してみましょう。 データベースを右クリックし、コンテキスト メニューから [名前の変更] を選択し、名前を変更 SecurityTutorialsDatabaseします。 これにより、ファイル名は変更されず、データベースが自身を識別するために使用する名前だけがSQL Server。

データベースの名前を SecurityTutorialsDatabase に変更する

図 6: データベースの名前を に SecurityTutorialsDatabase変更します (クリックするとフルサイズの画像が表示されます)

この時点で、データベース ファイルのサーバー名とデータベース名SecurityTutorials.mdfがわかっています。SecurityTutorialsDatabaselocalhost\InstanceName これで、ツールを使用してアプリケーション サービスをインストールする準備ができました aspnet_regsql.exe

Application Services のインストール

ツールを aspnet_regsql.exe 起動するには、スタート メニューに移動し、[実行] を選択します。 テキスト ボックスに「」と入力 %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe し、[OK] をクリックします。 または、Windows エクスプローラーを使用して適切なフォルダーにドリルダウンし、ファイルをaspnet_regsql.exeダブルクリックすることもできます。 どちらの方法でも同じ結果が得られます。

コマンド ライン引数をaspnet_regsql.exe指定せずにツールを実行すると、ASP.NET SQL Server セットアップ ウィザードのグラフィカル ユーザー インターフェイスが起動します。 ウィザードを使用すると、指定したデータベース上の ASP.NET アプリケーション サービスを簡単に追加または削除できます。 図 7 に示すウィザードの最初の画面では、ツールの目的について説明します。

ASP.NET SQL Server セットアップ ウィザードを使用してメンバーシップ スキーマを追加する

図 7: ASP.NET SQL Server セットアップ ウィザードを使用してメンバーシップ スキーマを追加する (フルサイズの画像を表示する をクリックします)

ウィザードの 2 番目の手順では、アプリケーション サービスを追加するか削除するかを確認します。 に必要なSqlMembershipProviderテーブル、ビュー、およびストアド プロシージャを追加するため、[ アプリケーション サービスのSQL Serverの構成] オプションを選択します。 後でデータベースからこのスキーマを削除する場合は、このウィザードを再実行しますが、代わりに [既存のデータベースからアプリケーション サービス情報を削除する] オプションを選択します。

[アプリケーション サービスのSQL Serverの構成] オプションを選択します

図 8: [アプリケーション サービスのSQL Serverの構成] オプションを選択します (クリックするとフルサイズの画像が表示されます)

3 番目の手順では、データベース情報 (サーバー名、認証情報、データベース名) の入力を求めます。 このチュートリアルに従い、データベースを に追加SecurityTutorials.mdfし、 にApp_Dataアタッチし、 にlocalhost\InstanceNameSecurityTutorialsDatabase名前を変更した場合は、次の値を使用します。

  • サーバー: localhost\InstanceName
  • Windows 認証
  • データベース: SecurityTutorialsDatabase

データベース情報を入力する

図 9: データベース情報を入力します (クリックするとフルサイズの画像が表示されます)

データベース情報を入力したら、[次へ] をクリックします。 最後の手順は、実行される手順をまとめたものです。 [次へ] をクリックしてアプリケーション サービスをインストールし、[完了] をクリックしてウィザードを完了します。

注意

Management Studio を使用してデータベースをアタッチし、データベース ファイルの名前を変更した場合は、Visual Studio を再度開く前に、必ずデータベースをデタッチして Management Studio を閉じてください。 データベースを SecurityTutorialsDatabase デタッチするには、データベース名を右クリックし、[タスク] メニューから [デタッチ] を選択します。

ウィザードが完了したら、Visual Studio に戻り、データベース エクスプローラーに移動します。 [テーブル] フォルダーを展開します。 名前が プレフィックス aspnet_で始まる一連のテーブルが表示されます。 同様に、さまざまなビューとストアド プロシージャは、[ビュー] フォルダーと [ストアド プロシージャ] フォルダーにあります。 これらのデータベース オブジェクトは、アプリケーション サービス スキーマを構成します。 手順 3 で、メンバーシップ固有のデータベース オブジェクトとロール固有のデータベース オブジェクトについて調べます。

さまざまなテーブル、ビュー、ストアド プロシージャがデータベースに追加されました

図 10: さまざまなテーブル、ビュー、およびストアド プロシージャがデータベースに追加されました (フルサイズの画像を表示する をクリックします)

注意

ツールのグラフィカル ユーザー インターフェイスは aspnet_regsql.exe 、アプリケーション サービス スキーマ全体をインストールします。 ただし、コマンド ラインから実行する aspnet_regsql.exe 場合は、インストール (または削除) する特定のアプリケーション サービス コンポーネントを指定できます。 したがって、 と SqlRoleProvider プロバイダーに必要なSqlMembershipProviderテーブル、ビュー、ストアド プロシージャのみを追加する場合は、コマンド ラインから を実行aspnet_regsql.exeします。 または、 によって使用される T-SQL 作成スクリプトの適切なサブセットを手動で aspnet_regsql.exe実行することもできます。 これらのスクリプトは、WINDIR%\Microsoft.Net\Framework\v2.0.50727\などのInstallSqlState.sqlInstallCommon.sqlInstallMembership.sqlInstallRoles.sqlInstallProfile.sql名前のフォルダーにあります。

この時点で、 で必要なデータベース オブジェクトを SqlMembershipProvider作成しました。 ただし、メンバーシップ フレームワークに対して 、 を使用する必要があり、 ActiveDirectoryMembershipProviderがデータベースをSqlMembershipProvider使用するようにSqlMembershipProvider指示するSecurityTutorials必要があります。 使用するプロバイダーを指定する方法と、手順 4 で選択したプロバイダーの設定をカスタマイズする方法について説明します。 しかし、まず、先ほど作成したデータベース オブジェクトについて詳しく見てみましょう。

手順 3: スキーマのコア テーブルを確認する

ASP.NET アプリケーションで Membership フレームワークと Roles フレームワークを操作する場合、実装の詳細はプロバイダーによってカプセル化されます。 今後のチュートリアルでは、.NET Framework Membership と クラスを介してこれらのフレームワークとRolesインターフェイスします。 これらの高度な API を使用する場合、実行されるクエリや、 と SqlRoleProviderによってSqlMembershipProvider変更されるテーブルなど、低レベルの詳細に関心を持つ必要はありません。

これを考えると、手順 2 で作成したデータベース スキーマを調べることなく、メンバーシップとロールのフレームワークを自信を持って使用できます。 ただし、アプリケーション データを格納するテーブルを作成する場合は、ユーザーまたはロールに関連するエンティティを作成する必要がある場合があります。 アプリケーション データ テーブルと手順 2 で作成した SqlMembershipProvider テーブルとの間に外部キー制約を確立する際に、 と SqlRoleProvider スキーマについて理解を深めるのに役立ちます。 さらに、まれな状況では、 または Roles クラスではなく、データベース レベルMembershipでユーザーおよびロール ストアと直接インターフェイスする必要がある場合があります。

ユーザー ストアをアプリケーションにパーティション分割する

メンバーシップとロールのフレームワークは、1 つのユーザーとロール ストアをさまざまなアプリケーション間で共有できるように設計されています。 Membership または Roles フレームワークを使用する ASP.NET アプリケーションでは、使用するアプリケーション パーティションを指定する必要があります。 つまり、複数の Web アプリケーションで同じユーザーストアとロール ストアを使用できます。 図 11 は、HRSite、CustomerSite、SalesSite の 3 つのアプリケーションにパーティション分割されたユーザーストアとロール ストアを示しています。 これら 3 つの Web アプリケーションはそれぞれ独自の一意のユーザーとロールを持ちますが、すべて同じデータベース テーブルにユーザー アカウントとロール情報を物理的に格納します。

複数のアプリケーション間でユーザー アカウントをパーティション分割する

図 11: 複数のアプリケーション間でユーザー アカウントがパーティション分割される可能性がある (フルサイズの画像を表示する をクリックします)

テーブルは aspnet_Applications 、これらのパーティションを定義します。 データベースを使用してユーザー アカウント情報を格納する各アプリケーションは、このテーブルの行で表されます。 aspnet_Applicationsテーブルには、、ApplicationNameLoweredApplicationNameおよび Descriptionの 4 つの列がありますApplicationIdApplicationId は 型 uniqueidentifier であり、テーブルの主キーです ApplicationName 。アプリケーションごとに一意のわかりやすい名前が提供されます。

他のメンバーシップ関連テーブルとロール関連テーブルは、 のaspnet_ApplicationsフィールドにApplicationIdリンクされます。 たとえば、各ユーザー アカウントの aspnet_Users レコードを含むテーブルには ApplicationId 、外部キー フィールド (テーブルの aspnet_Roles ditto) があります。 これらのテーブルのフィールドは ApplicationId 、ユーザー アカウントまたはロールが属するアプリケーション パーティションを指定します。

ユーザー アカウント情報の格納

ユーザー アカウント情報は、 と aspnet_Membershipの 2 つのテーブルに格納されますaspnet_Users。 テーブル aspnet_Users には、重要なユーザー アカウント情報を保持するフィールドが含まれています。 最も関連する 3 つの列は次のとおりです。

  • UserId
  • UserName
  • ApplicationId

UserId は主キー (および 型 uniqueidentifier) です。 UserName は 型 nvarchar(256) であり、パスワードと共にユーザーの資格情報を構成します。 (ユーザーのパスワードはテーブルApplicationIdaspnet_Membership格納されます)。では、ユーザー アカウントを 特定のアプリケーションにaspnet_Applicationsリンクします。 列と ApplicationId 列にはUserName複合UNIQUE制約があります。 これにより、特定のアプリケーションで各 UserName が一意になりますが、異なるアプリケーションで同じもの UserName を使用できるようになります。

テーブル aspnet_Membership には、ユーザーのパスワード、電子メール アドレス、最後のログイン日時など、追加のユーザー アカウント情報が含まれています。 テーブルと aspnet_Membership テーブル内のレコードの間には、一対一のaspnet_Users対応があります。 このリレーションシップは、 の フィールドaspnet_MembershipによってUserId保証されます。これはテーブルの主キーとして機能します。 テーブルと同様に aspnet_Users 、 には、 aspnet_Membership この情報を ApplicationId 特定のアプリケーション パーティションに結び付けるフィールドが含まれています。

パスワードのセキュリティ保護

パスワード情報はテーブルに aspnet_Membership 格納されます。 SqlMembershipProviderでは、次の 3 つの手法のいずれかを使用して、データベースにパスワードを格納できます。

  • クリア - パスワードはプレーンテキストとしてデータベースに格納されます。 私はこのオプションを使用しないことを強くお勧めします。 データベースが侵害された場合は、バックドアを見つけたハッカーや、データベースにアクセスできる不満を持つ従業員など、すべてのユーザーの資格情報が取得用に存在します。
  • ハッシュ化 - パスワードは、一方向ハッシュ アルゴリズムとランダムに生成されたソルト値を使用してハッシュされます。 このハッシュ値 (および salt) は、データベースに格納されます。
  • 暗号化 - 暗号化されたバージョンのパスワードがデータベースに格納されます。

使用されるパスワード ストレージ手法は、 でSqlMembershipProviderWeb.config指定された設定によって異なります。 手順 4 で設定を SqlMembershipProvider カスタマイズする方法について説明します。 既定の動作では、パスワードのハッシュを格納します。

パスワードの格納を担当する列は、 PasswordPasswordFormat、および です PasswordSaltPasswordFormat は、パスワードの格納に使用される手法を示す型 int のフィールドです。Clear の場合は 0、ハッシュの場合は 1、Encrypted の場合は 2 です。 PasswordSalt は、使用されるパスワード ストレージ手法に関係なく、ランダムに生成された文字列が割り当てられます。の PasswordSalt 値は、パスワードのハッシュを計算する場合にのみ使用されます。 最後に、列には、 Password プレーンテキスト パスワード、パスワードのハッシュ、暗号化されたパスワードなど、実際のパスワード データが含まれます。

表 1 は、パスワード MySecret を格納するときのさまざまなストレージ手法に対して、これら 3 つの列の外観を示しています。 .

ストレージ手法<_o3a_p /> Password<_o3a_p /> PasswordFormat<_o3a_p /> PasswordSalt<_o3a_p />
Clear MySecret! 0 tTnkPlesqissc2y2SMEygA==
ハッシュ 2oXm6sZHWbTHFgjgkGQsc2Ec9ZM= 1 wFgjUfhdUFOCKQiI61vtiQ==
Encrypted 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUU3e7Inza9j9BKp 2 LSRzhGS/aa/oqAXGLHJNBw==

表 1: パスワード MySecret! を格納するときの Password-Related フィールドの値の例

注意

によって SqlMembershipProvider 使用される特定の暗号化またはハッシュ アルゴリズムは、 要素の <machineKey> 設定によって決まります。

ロールとロールの関連付けの格納

ロール フレームワークを使用すると、開発者は一連のロールを定義し、どのユーザーがどのロールに属するかを指定できます。 この情報は、 と aspnet_UsersInRolesの 2 つのテーブルaspnet_Rolesを介してデータベースにキャプチャされます。 テーブル内の各レコードは aspnet_Roles 、特定のアプリケーションのロールを表します。 テーブルと同様に aspnet_Users 、テーブルにはディスカッションに aspnet_Roles 関連する 3 つの列があります。

  • RoleId
  • RoleName
  • ApplicationId

RoleId は主キー (および 型 uniqueidentifier) です。 RoleNamenvarchar(256) 型です。 ユーザー ApplicationId アカウントを の特定のアプリケーションに aspnet_Applicationsリンクします。 列と ApplicationId 列には複合UNIQUE制約RoleNameがあり、特定のアプリケーションで各ロール名が一意であることを確認します。

テーブルは aspnet_UsersInRoles 、ユーザーとロールの間のマッピングとして機能します。 と の 2 つの列 UserIdRoleId のみが存在し、複合主キーを構成します。

手順 4: プロバイダーを指定し、その設定をカスタマイズする

メンバーシップフレームワークやロール フレームワークなど、プロバイダー モデルをサポートするすべてのフレームワークには実装の詳細がなく、代わりにその責任をプロバイダー クラスに委任します。 Membership フレームワークの場合、クラスは Membership ユーザー アカウントを管理するための API を定義しますが、ユーザー ストアと直接対話することはありません。 代わりに、 Membership クラスのメソッドは、構成されたプロバイダーに要求を渡します。ここでは を使用します SqlMembershipProvider。 クラス内 Membership のいずれかのメソッドを呼び出すと、Membership フレームワークは、 への呼び出し SqlMembershipProviderを委任する方法をどのように認識しますか?

MembershipクラスにはProvidersMembership フレームワークで使用できる登録されているすべてのプロバイダー クラスへの参照を含むプロパティがあります。 登録されている各プロバイダーには、名前と型が関連付けられています。 名前は、コレクション内の特定のプロバイダーを参照するためのわかりやすい方法を Providers 提供しますが、型はプロバイダー クラスを識別します。 さらに、登録されている各プロバイダーには構成設定が含まれる場合があります。 メンバーシップ フレームワークの構成設定には PasswordFormat 、 や requiresUniqueEmailなどがあります。 で使用される構成設定の完全な一覧については、表 2 を SqlMembershipProvider参照してください。

プロパティの内容は Providers 、Web アプリケーションの構成設定を使用して指定されます。 既定では、すべての Web アプリケーションには、 型SqlMembershipProviderの という名前AspNetSqlMembershipProviderのプロバイダーがあります。 この既定のメンバーシップ プロバイダーは に machine.config 登録されます (にあります %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG)。

<membership> 
 <providers>
 <add name="AspNetSqlMembershipProvider"
 type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
 connectionStringName="LocalSqlServer"
 enablePasswordRetrieval="false"
 enablePasswordReset="true"
 requiresQuestionAndAnswer="true"
 applicationName="/"
 requiresUniqueEmail="false"
 passwordFormat="Hashed"
 maxInvalidPasswordAttempts="5"
 minRequiredPasswordLength="7"
 minRequiredNonalphanumericCharacters="1"
 passwordAttemptWindow="10"
 passwordStrengthRegularExpression=""/>
 </providers> 
</membership>

上のマークアップが示すように、 要素は<membership> Membership フレームワークの構成設定を定義し<providers>、子要素は登録済みプロバイダーを指定します。 プロバイダーは、 要素または 要素を使用して<add><remove>追加または削除できます。要素を<clear>使用して、現在登録されているすべてのプロバイダーを削除します。 上のマークアップに示すように、 machine.config 型の という名前 AspNetSqlMembershipProvider のプロバイダーを追加します SqlMembershipProvider

および 属性にnametype加えて、 要素には、<add>さまざまな構成設定の値を定義する属性が含まれています。 表 2 に、使用可能な SqlMembershipProvider固有の構成設定と、それぞれの説明を示します。

注意

表 2 に示す既定値は、 クラスで定義されている既定値を SqlMembershipProvider 参照します。 のすべての構成設定 AspNetSqlMembershipProvider が クラスの既定値 SqlMembershipProvider に対応しているわけではないことに注意してください。 たとえば、メンバーシップ プロバイダーで指定されていない場合、設定の requiresUniqueEmail 既定値は true になります。 ただし、 は AspNetSqlMembershipProvider 、 の値を明示的に指定することで、この既定値を falseオーバーライドします。

設定<_o3a_p /> 説明<_o3a_p />
ApplicationName メンバーシップ フレームワークを使用すると、1 つのユーザー ストアを複数のアプリケーション間でパーティション分割できます。 この設定は、メンバーシップ プロバイダーによって使用されるアプリケーション パーティションの名前を示します。 この値が明示的に指定されていない場合は、実行時にアプリケーションの仮想ルート パスの値に設定されます。
commandTimeout SQL コマンドのタイムアウト値 (秒単位) を指定します。 既定値は 30 です。
connectionStringName ユーザー ストア データベースへの接続に使用する 要素内<connectionStrings>の接続文字列の名前。 この値は必須です。
description 登録されたプロバイダーのわかりやすい説明を提供します。
enablePasswordRetrieval ユーザーが忘れたパスワードを取得できるかどうかを指定します。 既定値は false です。
enablePasswordReset ユーザーが自分のパスワードをリセットできるかどうかを示します。 既定値は true です。
maxInvalidPasswordAttempts ユーザーがロックアウトされるまでに指定された passwordAttemptWindow ユーザーに対して発生する可能性があるログイン試行の失敗の最大数。既定値は 5 です。
minRequiredNonalphanumericCharacters ユーザーのパスワードに表示する必要がある英数字以外の文字の最小数。 この値は 0 から 128 の間である必要があります。既定値は 1 です。
minRequiredPasswordLength パスワードに必要な最小文字数。 この値は 0 から 128 の間である必要があります。既定値は 7 です。
name 登録済みプロバイダーの名前。 この値は必須です。
passwordAttemptWindow ログイン試行の失敗が追跡される時間 (分)。 ユーザーがこの指定されたウィンドウ内で無効なログイン資格情報を maxInvalidPasswordAttempts 指定した場合、ユーザーはロックアウトされます。既定値は 10 です。
PasswordFormat パスワード ストレージ形式: ClearHashed、または Encrypted。 既定値は、Hashed です。
passwordStrengthRegularExpression 指定した場合、この正規表現は、新しいアカウントを作成するとき、またはパスワードを変更するときに、ユーザーが選択したパスワードの強度を評価するために使用されます。 既定値は空の文字列です。
requiresQuestionAndAnswer パスワードを取得またはリセットするときに、ユーザーがセキュリティに関する質問に回答する必要があるかどうかを指定します。 既定値は true です。
requiresUniqueEmail 特定のアプリケーション パーティション内のすべてのユーザー アカウントに一意の電子メール アドレスが必要かどうかを示します。 既定値は true です。
type プロバイダーの型を指定します。 この値は必須です。

表 2: メンバーシップと SqlMembershipProvider 構成設定

に加えて、 AspNetSqlMembershipProvider他のメンバーシップ プロバイダーをアプリケーションごとに登録するには、同様のマークアップをファイルに Web.config 追加します。

注意

ロール フレームワークは、ほとんど同じように機能します。には既定の登録済みロール プロバイダーがあり、 の machine.config アプリケーションごとに Web.config登録されたプロバイダーをカスタマイズできます。 今後のチュートリアルでは、Roles フレームワークとその構成マークアップについて詳しく説明します。

設定のSqlMembershipProviderカスタマイズ

既定値 SqlMembershipProvider (AspNetSqlMembershipProvider) の属性は connectionStringNameLocalSqlServer設定されています。 プロバイダーと同様にAspNetSqlMembershipProvider、接続文字列名LocalSqlServerは でmachine.config定義されます。

<connectionStrings> 
 <add name="LocalSqlServer" 
 connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
 providerName="System.Data.SqlClient"/> 
</connectionStrings>

ご覧のとおり、この接続文字列では、 にある SQL 2005 Express Edition データベースが定義されています。DataDirectory|aspnetdb.mdf。 文字列 |DataDirectory|は実行時にディレクトリを指すために ~/App_Data/ 変換されるため、データベース パス |DataDirectory|aspnetdb.mdf は に ~/App_Data/aspnet.mdf変換されます。

アプリケーションのファイルにメンバーシップ プロバイダー情報を指定しなかった場合、アプリケーションでは既定の Web.config 登録済みメンバーシップ プロバイダー AspNetSqlMembershipProviderである が使用されます。 データベースが ~/App_Data/aspnet.mdf 存在しない場合、ASP.NET ランタイムによって自動的にデータベースが作成され、アプリケーション サービス スキーマが追加されます。 ただし、データベースを使用 aspnet.mdf するのではなく、手順 2 で作成したデータベースを SecurityTutorials.mdf 使用します。 この変更は、次の 2 つの方法のいずれかで実行できます。

  • の値を指定します。LocalSqlServerに名前を接続文字列しますWeb.configWeb.config接続文字列名の値をLocalSqlServer上書きすることで、既定の登録済みメンバーシップ プロバイダー (AspNetSqlMembershipProvider) を使用し、データベースでSecurityTutorials.mdf正しく動作させることができます。 この方法は、 で AspNetSqlMembershipProvider指定された構成設定を含むコンテンツである場合に問題ありません。 この手法の詳細については、Scott Guthrie のブログ記事「SQL Server 2000 または SQL Server 2005 を使用するように ASP.NET 2.0 Application Services を構成する」を参照してください。
  • SqlMembershipProviderの新しい登録済みプロバイダーを追加するを構成します。connectionStringNameを指すSecurityTutorials.mdf設定データベース。この方法は、データベース 接続文字列に加えて、他の構成プロパティをカスタマイズするシナリオで役立ちます。 私のプロジェクトでは、柔軟性と読みやすさのために常にこのアプローチを使用しています。

データベースを参照する新しい登録済みプロバイダーをSecurityTutorials.mdf追加する前に、 の セクションWeb.configに適切な接続文字列値を追加する<connectionStrings>必要があります。 次のマークアップは、 フォルダー内のSQL Server 2005 Express Edition データベースを参照する という名前SecurityTutorialsConnectionStringの新しい接続文字列SecurityTutorials.mdfApp_Data追加します。

<configuration>
 <connectionStrings>
 <add name="SecurityTutorialsConnectionString" 
 connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True" 
 providerName="System.Data.SqlClient"/>
 </connectionStrings> 
 <system.web>
 ... Configuration markup removed for brevity ...  </system.web>
</configuration>

注意

代替データベース ファイルを使用している場合は、必要に応じて接続文字列を更新します。 正しい接続文字列の形成の詳細については、「ConnectionStrings.com」を参照してください。

次に、次のメンバーシップ構成マークアップをファイルに追加します Web.config 。 このマークアップは、 という名前 SecurityTutorialsSqlMembershipProviderの新しいプロバイダーを登録します。

<configuration>
 <connectionStrings>
 <add name="SecurityTutorialsConnectionString" 
 connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True" 
 providerName="System.Data.SqlClient"/>
 </connectionStrings> 
 <system.web>
 <membership defaultProvider="SecurityTutorialsSqlMembershipProvider">
 <providers>
 <!-- Add a customized SqlMembershipProvider --> 
 <add name="SecurityTutorialsSqlMembershipProvider" 
 type="System.Web.Security.SqlMembershipProvider"
 connectionStringName="SecurityTutorialsConnectionString"
 enablePasswordRetrieval="false"
 enablePasswordReset="true"
 requiresQuestionAndAnswer="true"
 applicationName="SecurityTutorials"
 requiresUniqueEmail="true"
 passwordFormat="Hashed"
 maxInvalidPasswordAttempts="5"
 minRequiredPasswordLength="7"
 minRequiredNonalphanumericCharacters="1"
 passwordAttemptWindow="10"
 passwordStrengthRegularExpression=""/>
 </providers>
 </membership>
 ... Configuration markup removed for brevity ... 
 </system.web>
</configuration>

上記のマークアップは、プロバイダーのSecurityTutorialsSqlMembershipProvider登録に加えて、 を既定のプロバイダーとして定義SecurityTutorialsSqlMembershipProviderします (要素の 属性を<membership>使用defaultProvider)。 メンバーシップ フレームワークには、複数の登録済みプロバイダーを含めることができることを思い出してください。 は でmachine.config最初のプロバイダーとして登録されるためAspNetSqlMembershipProvider、特に指定しない限り、既定のプロバイダーとして機能します。

現在、アプリケーションには、 と SecurityTutorialsSqlMembershipProviderの 2 つの登録済みプロバイダーがありますAspNetSqlMembershipProvider。 ただし、プロバイダーを登録するSecurityTutorialsSqlMembershipProvider前に、要素の直前<add>に 要素を追加することで、以前に登録されたすべてのプロバイダーを<clear />クリアできました。 これにより、登録済みプロバイダーの一覧から が AspNetSqlMembershipProvider クリアされます。つまり SecurityTutorialsSqlMembershipProvider 、 が唯一の登録済みメンバーシップ プロバイダーになります。 この方法を使用した場合、登録されているメンバーシップ プロバイダーは唯一であるため、 を既定のプロバイダーとしてマーク SecurityTutorialsSqlMembershipProvider する必要はありません。 の使用<clear />の詳細については、「プロバイダーの追加時の使用<clear />」を参照してください。

SecurityTutorialsSqlMembershipProviderconnectionStringName設定では、追加した接続文字列SecurityTutorialsConnectionString名が参照され、そのapplicationName設定が SecurityTutorials の値に設定されていることに注意してください。 さらに、この requiresUniqueEmail 設定は に true設定されています。 その他のすべての構成オプションは、 の AspNetSqlMembershipProvider値と同じです。 必要に応じて、ここで構成を自由に変更できます。 たとえば、1 つではなく 2 つの英数字以外の文字を必要とするか、パスワードの長さを 7 文字ではなく 8 文字に増やして、パスワードの強度を強化できます。

注意

Membership フレームワークを使用すると、1 つのユーザー ストアを複数のアプリケーション間でパーティション分割できます。 メンバーシップ プロバイダーの applicationName 設定は、ユーザー ストアを操作するときにプロバイダーが使用するアプリケーションを示します。 が明示的に設定されていない場合applicationName、実行時に Web アプリケーションの仮想ルート パスに割り当てられるため、構成設定の値applicationNameを明示的に設定することが重要です。 これは、アプリケーションの仮想ルート パスが変更されない限り正常に動作しますが、アプリケーションを別のパスに移動すると、 applicationName 設定も変更されます。 この場合、メンバーシップ プロバイダーは、以前に使用したアプリケーション パーティションとは異なるアプリケーション パーティションの操作を開始します。 移動前に作成されたユーザー アカウントは別のアプリケーション パーティションに存在し、それらのユーザーはサイトにログインできなくなります。 この問題の詳細については、「 ASP.NET 2.0 メンバーシップと他のプロバイダーを構成するときに常にプロパティを設定 applicationName する」を参照してください。

まとめ

この時点で、アプリケーション サービス (SecurityTutorials.mdf) が構成されたデータベースがあり、メンバーシップ フレームワークが登録したプロバイダーを使用するように Web アプリケーションを SecurityTutorialsSqlMembershipProvider 構成しました。 この登録済みプロバイダーは 型SqlMembershipProviderであり、適切connectionStringNameな接続文字列 (SecurityTutorialsConnectionString) に設定され、その値がapplicationName明示的に設定されています。

これで、アプリケーションからメンバーシップ フレームワークを使用する準備ができました。 次のチュートリアルでは、新しいユーザー アカウントを作成する方法について説明します。 その後、ユーザーの認証、ユーザーベースの承認の実行、およびデータベースへの追加のユーザー関連情報の格納について説明します。

幸せなプログラミング!

もっと読む

このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。

このチュートリアルに含まれるトピックに関するビデオ トレーニング

著者について

複数の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 Scott は、 または mitchell@4guysfromrolla.com のブログを http://ScottOnWriting.NET介してアクセスできます。

特別な感謝

このチュートリアル シリーズは、多くの役立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、Alicja Maziarz でした。 今後の MSDN 記事の確認に関心がありますか? その場合は、 に行 mitchell@4GuysFromRolla.comをドロップしてください。