SQL Server でメンバーシップ スキーマを作成する (VB)
注意
この記事が作成されて以来、ASP.NET メンバーシップ プロバイダーは ASP.NET Identity に置き換えられました。 この記事の執筆時点で取り上げられたメンバーシップ プロバイダーではなく 、ASP.NET ID プラットフォームを使用するようにアプリを更新することを強くお勧めします。 ASP.NET ID には、ASP.NET メンバーシップ システムに比して、次のような多くの利点があります。
- パフォーマンスの向上
- 拡張性とテスト性の向上
- OAuth、OpenID Connect、および 2 要素認証のサポート
- クレームベースの ID のサポート
- ASP.Net Core との相互運用性の向上
このチュートリアルでは、まず、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 つの組み込みのメンバーシップ プロバイダーと SqlMembershipProvider
がActiveDirectoryMembershipProvider
付属しています。 その名前が示すように、 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
追加します。以降のチュートリアルでは、アプリケーション データをキャプチャするための追加のテーブルを作成します。
図 1: 名前付きSecurityTutorials.mdf
データベースの新しいSQL DatabaseをApp_Data
フォルダーに追加する (フルサイズの画像を表示する をクリックします)
フォルダーにデータベースをApp_Data
追加すると、データベース エクスプローラー ビューにデータベースが自動的に含まれます。 (非 Express Edition バージョンの Visual Studio では、データベース エクスプローラーはサーバー エクスプローラーと呼ばれます)。[データベース] エクスプローラーに移動し、追加SecurityTutorials
したばかりのデータベースを展開します。 [データベース エクスプローラー] が画面に表示されない場合は、[表示] メニューの [データベース エクスプローラー] を選択するか、Ctrl + Alt + S キーを押します。 図 2 に示すように、 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 認証] を選択します。
図 3: SQL Server 2005 Express Edition インスタンスに接続する (フルサイズの画像を表示する をクリックします)
SQL Server 2005 Express Edition インスタンスに接続すると、Management Studio には、データベース、セキュリティ設定、サーバー オブジェクトなどのフォルダーが表示されます。 [データベース] タブを展開すると、データベースがデータベース インスタンスに登録されていないことが表示SecurityTutorials.mdf
されます。最初にデータベースをアタッチする必要があります。
[データベース] フォルダーを右クリックし、コンテキスト メニューから [アタッチ] を選択します。 [データベースのアタッチ] ダイアログ ボックスが表示されます。 ここから [追加] ボタンをクリックし、データベースを SecurityTutorials.mdf
参照して [OK] をクリックします。 図 4 は、データベースを選択した後の [データベースのアタッチ] ダイアログ ボックスを SecurityTutorials.mdf
示しています。 図 5 は、データベースが正常にアタッチされた後の Management Studio のオブジェクト エクスプローラーを示しています。
図 4: データベースをアタッチする SecurityTutorials.mdf
(クリックするとフルサイズの画像が表示されます)
図 5: データベースフォルダー SecurityTutorials.mdf
にデータベースが表示される (クリックするとフルサイズの画像が表示されます)
図 5 に示すように、データベースの SecurityTutorials.mdf
名前はかなり控えめです。 より覚えやすい (入力しやすい) 名前に変更してみましょう。 データベースを右クリックし、コンテキスト メニューから [名前の変更] を選択し、名前を変更 SecurityTutorialsDatabase
します。 これにより、ファイル名は変更されず、データベースが自身を識別するために使用する名前だけがSQL Server。
図 6: データベースの名前を に SecurityTutorialsDatabase
変更します (クリックするとフルサイズの画像が表示されます)
この時点で、データベース ファイルのサーバー名とデータベース名SecurityTutorials.mdf
がわかっています。SecurityTutorialsDatabase
localhost\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 に示すウィザードの最初の画面では、ツールの目的について説明します。
図 7: ASP.NET SQL Server セットアップ ウィザードを使用してメンバーシップ スキーマを追加する (フルサイズの画像を表示する をクリックします)
ウィザードの 2 番目の手順では、アプリケーション サービスを追加するか削除するかを確認します。 に必要なSqlMembershipProvider
テーブル、ビュー、およびストアド プロシージャを追加するため、[ アプリケーション サービスのSQL Serverの構成] オプションを選択します。 後でデータベースからこのスキーマを削除する場合は、このウィザードを再実行しますが、代わりに [既存のデータベースからアプリケーション サービス情報を削除する] オプションを選択します。
図 8: [アプリケーション サービスのSQL Serverの構成] オプションを選択します (クリックするとフルサイズの画像が表示されます)
3 番目の手順では、データベース情報 (サーバー名、認証情報、データベース名) の入力を求めます。 このチュートリアルに従い、データベースを に追加SecurityTutorials.mdf
し、 にApp_Data
アタッチし、 にlocalhost\InstanceName
SecurityTutorialsDatabase
名前を変更した場合は、次の値を使用します。
- サーバー:
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.sql
InstallCommon.sql
InstallMembership.sql
InstallRoles.sql
InstallProfile.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
テーブルには、、ApplicationName
LoweredApplicationName
および Description
の 4 つの列がありますApplicationId
。ApplicationId
は 型 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)
であり、パスワードと共にユーザーの資格情報を構成します。 (ユーザーのパスワードはテーブルApplicationId
にaspnet_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) は、データベースに格納されます。
- 暗号化 - 暗号化されたバージョンのパスワードがデータベースに格納されます。
使用されるパスワード ストレージ手法は、 でSqlMembershipProvider
Web.config
指定された設定によって異なります。 手順 4 で設定を SqlMembershipProvider
カスタマイズする方法について説明します。 既定の動作では、パスワードのハッシュを格納します。
パスワードの格納を担当する列は、 Password
、 PasswordFormat
、および です PasswordSalt
。 PasswordFormat
は、パスワードの格納に使用される手法を示す型 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
) です。 RoleName
は nvarchar(256)
型です。 ユーザー ApplicationId
アカウントを の特定のアプリケーションに aspnet_Applications
リンクします。 列と ApplicationId
列には複合UNIQUE
制約RoleName
があり、特定のアプリケーションで各ロール名が一意であることを確認します。
テーブルは aspnet_UsersInRoles
、ユーザーとロールの間のマッピングとして機能します。 と の 2 つの列 UserId
RoleId
のみが存在し、複合主キーを構成します。
手順 4: プロバイダーを指定し、その設定をカスタマイズする
メンバーシップフレームワークやロール フレームワークなど、プロバイダー モデルをサポートするすべてのフレームワークには実装の詳細がなく、代わりにその責任をプロバイダー クラスに委任します。 Membership フレームワークの場合、クラスは Membership
ユーザー アカウントを管理するための API を定義しますが、ユーザー ストアと直接対話することはありません。 代わりに、 Membership
クラスのメソッドは、構成されたプロバイダーに要求を渡します。ここでは を使用します SqlMembershipProvider
。 クラス内 Membership
のいずれかのメソッドを呼び出すと、Membership フレームワークは、 への呼び出し SqlMembershipProvider
を委任する方法をどのように認識しますか?
Membership
クラスには、Providers
Membership フレームワークで使用できる登録されているすべてのプロバイダー クラスへの参照を含むプロパティがあります。 登録されている各プロバイダーには、名前と型が関連付けられています。 名前は、コレクション内の特定のプロバイダーを参照するためのわかりやすい方法を 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
。
および 属性にname
type
加えて、 要素には、<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 |
パスワード ストレージ形式: Clear 、 Hashed 、または Encrypted 。 既定値は、Hashed です。 |
passwordStrengthRegularExpression |
指定した場合、この正規表現は、新しいアカウントを作成するとき、またはパスワードを変更するときに、ユーザーが選択したパスワードの強度を評価するために使用されます。 既定値は空の文字列です。 |
requiresQuestionAndAnswer |
パスワードを取得またはリセットするときに、ユーザーがセキュリティに関する質問に回答する必要があるかどうかを指定します。 既定値は true です。 |
requiresUniqueEmail |
特定のアプリケーション パーティション内のすべてのユーザー アカウントに一意の電子メール アドレスが必要かどうかを示します。 既定値は true です。 |
type |
プロバイダーの型を指定します。 この値は必須です。 |
表 2: メンバーシップと SqlMembershipProvider
構成設定
に加えて、 AspNetSqlMembershipProvider
他のメンバーシップ プロバイダーをアプリケーションごとに登録するには、同様のマークアップをファイルに Web.config
追加します。
注意
ロール フレームワークは、ほとんど同じように機能します。には既定の登録済みロール プロバイダーがあり、 の machine.config
アプリケーションごとに Web.config
登録されたプロバイダーをカスタマイズできます。 今後のチュートリアルでは、Roles フレームワークとその構成マークアップについて詳しく説明します。
設定のSqlMembershipProvider
カスタマイズ
既定値 SqlMembershipProvider
(AspNetSqlMembershipProvider
) の属性は connectionStringName
に LocalSqlServer
設定されています。 プロバイダーと同様に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.config
。のWeb.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.mdf
をApp_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 />
」を参照してください。
のSecurityTutorialsSqlMembershipProvider
connectionStringName
設定では、追加した接続文字列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.NET 2.0 メンバーシップおよびその他のプロバイダーを構成する場合は、常に プロパティを設定
applicationName
します - SQL Server 2000 または SQL Server 2005 を使用するように ASP.NET 2.0 Application Services を構成する
- SQL Server Management Studioのダウンロード
- ASP.NET 2.0s メンバーシップ、ロール、プロファイルの確認
<add>
メンバーシップのプロバイダーの 要素<membership>
要素- メンバーシップの
<providers>
要素 - プロバイダーの追加時の使用
<clear />
- を直接操作する
SqlMembershipProvider
このチュートリアルに含まれるトピックに関するビデオ トレーニング
著者について
複数の 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をドロップしてください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示