アプリケーション サービスを使用する Web サイトを構成する (C#)
注意
この記事が作成されて以来、ASP.NET メンバーシップ プロバイダーは ASP.NET Identity に置き換えられました。 この記事の執筆時点で取り上げられたメンバーシップ プロバイダーではなく 、ASP.NET ID プラットフォームを使用するようにアプリを更新することを強くお勧めします。 ASP.NET ID には、ASP.NET メンバーシップ システムに比して、次のような多くの利点があります。
- パフォーマンスの向上
- 拡張性とテスト性の向上
- OAuth、OpenID Connect、および 2 要素認証のサポート
- クレームベースの ID のサポート
- ASP.Net Core との相互運用性の向上
ASP.NET バージョン 2.0 では、一連のアプリケーション サービスが導入されました。これは、.NET Frameworkの一部であり、Web アプリケーションに豊富な機能を追加するために使用できる構成要素サービスのスイートとして機能します。 このチュートリアルでは、アプリケーション サービスを使用するように運用環境で Web サイトを構成する方法について説明し、運用環境でのユーザー アカウントとロールの管理に関する一般的な問題に対処します。
はじめに
ASP.NET バージョン 2.0 では、一連のアプリケーション サービスが導入されました。これは、.NET Frameworkの一部であり、Web アプリケーションに豊富な機能を追加するために使用できる構成要素サービスのスイートとして機能します。 アプリケーション サービスには次のものが含まれます。
- メンバーシップ - ユーザー アカウントを作成および管理するための API。
- ロール - ユーザーをグループに分類するための API。
- プロファイル - ユーザー固有のカスタム コンテンツを格納するための API。
- サイト マップ - 階層の形式でサイトの論理構造を定義するための API。メニューや階層リンクなどのナビゲーション コントロールを使用して表示できます。
- 個人用設定 - カスタマイズ設定を維持するための API。ほとんどの場合、 WebParts で使用されます。
- 正常性監視 - 実行中の Web アプリケーションのパフォーマンス、セキュリティ、エラー、およびその他のシステム正常性メトリックを監視するための API。
アプリケーション サービス API は、特定の実装に関連付けされていません。 代わりに、特定の プロバイダーを使用するようにアプリケーション サービスに指示し、そのプロバイダーは特定のテクノロジを使用してサービスを実装します。 Web ホスティング会社でホストされているインターネット ベースの Web アプリケーションで最もよく使用されるプロバイダーは、SQL Server データベース実装を使用するプロバイダーです。 たとえば、 SqlMembershipProvider
は、Microsoft SQL Server データベースにユーザー アカウント情報を格納する Membership API のプロバイダーです。
アプリケーション サービスとSQL Server プロバイダーを使用すると、アプリケーションをデプロイするときにいくつかの課題が発生します。 まず、アプリケーション サービス データベース オブジェクトを開発データベースと運用データベースの両方で適切に作成し、適切に初期化する必要があります。 また、行う必要がある重要な構成設定もあります。
注意
アプリケーション サービス API は、 プロバイダー モデルを使用して設計されました。これは、実行時に API の実装の詳細を提供できるようにする設計パターンです。 .NET Frameworkには、SQL Server データベース実装を使用するメンバーシップ API とロール API のプロバイダーである、 や SqlRoleProvider
などSqlMembershipProvider
、使用できる多数のアプリケーション サービス プロバイダーが付属しています。 カスタム プロバイダーを作成してプラグインすることもできます。 実際、Book Reviews Web アプリケーションには、サイト マップ API (ReviewSiteMapProvider
) のカスタム プロバイダーが既に含まれています。このプロバイダーは、データベース内の および Books
テーブルのGenres
データからサイト マップを構築します。
このチュートリアルでは、まず、メンバーシップ API とロール API を使用するように Book Reviews Web アプリケーションを拡張する方法について説明します。 次に、SQL Server データベース実装でアプリケーション サービスを使用する Web アプリケーションをデプロイする手順を説明し、運用環境でのユーザー アカウントとロールの管理に関する一般的な問題に対処します。
書籍レビュー アプリケーションに更新する
過去 2 つのチュートリアルでは、Book Reviews Web アプリケーションが静的 Web サイトから動的なデータ ドリブン Web アプリケーションに更新され、ジャンルとレビューを管理するための一連の管理ページが完成しました。 ただし、この管理セクションは現在保護されていません。管理ページの URL を知っている (または推測する) ユーザーは、サイトでレビューを作成、編集、または削除できます。 Web サイトの特定の部分を保護する一般的な方法は、ユーザー アカウントを実装し、URL 承認規則を使用して特定のユーザーまたはロールへのアクセスを制限することです。 このチュートリアルでダウンロードできる Book Reviews Web アプリケーションは、ユーザー アカウントとロールをサポートしています。 管理という名前の 1 つのロールが定義されており、このロールのユーザーのみが管理ページにアクセスできます。
注意
Book Reviews Web アプリケーションで、Scott、Jisun、Alice の 3 つのユーザー アカウントを作成しました。 3 人のユーザーはすべて同じパスワードを持っています: password!Scott と Jisun は管理の役割を果たしており、Alice は役割を果たしていません。 サイトの管理以外のページには、匿名ユーザーが引き続きアクセスできます。 つまり、サイトを管理しない限り、サイトにアクセスするためにサインインする必要はありません。その場合は、管理ロールのユーザーとしてサインインする必要があります。
Book Reviews アプリケーションのマスター ページが更新され、認証済みユーザーと匿名ユーザー用の別のユーザー インターフェイスが含まれています。 匿名ユーザーがサイトにアクセスすると、右上隅にログイン リンクが表示されます。 認証されたユーザーには、"ようこそ、 ユーザー名!" というメッセージと、ログアウトするためのリンクが表示されます。ログイン ページ (~/Login.aspx
) もあります。このページには、訪問者を認証するためのユーザー インターフェイスとロジックを提供する Login Web コントロールが含まれています。 管理者のみが新しいアカウントを作成できます。 (フォルダー内のユーザー アカウント ~/Admin
を作成および管理するためのページがあります)。
メンバーシップとロール API の構成
Book Reviews Web アプリケーションは、メンバーシップ API とロール API を使用してユーザー アカウントをサポートし、それらのユーザーをロール (つまり、管理 ロール) にグループ化します。 SqlMembershipProvider
および SqlRoleProvider
プロバイダー クラスは、アカウントとロールの情報をSQL Server データベースに格納するために使用されます。
注意
このチュートリアルは、メンバーシップ API とロール API をサポートするように Web アプリケーションを構成する際の詳細な調査を目的としたものではありません。 これらの API の詳細と、Web サイトを使用するように Web サイトを構成するために必要な手順については、 Web サイトのセキュリティ に関するチュートリアルを参照してください。
SQL Server データベースでアプリケーション サービスを使用するには、まず、これらのプロバイダーによって使用されるデータベース オブジェクトを、ユーザー アカウントとロール情報を格納するデータベースに追加する必要があります。 これらの必要なデータベース オブジェクトには、さまざまなテーブル、ビュー、ストアド プロシージャが含まれます。 特に指定しない限り、 および SqlRoleProvider
プロバイダー クラスは、SqlMembershipProvider
アプリケーションのフォルダーにある という名前ASPNETDB
の App_Data
SQL Server Express Edition データベースを使用します。そのようなデータベースが存在しない場合は、実行時にこれらのプロバイダーによって必要なデータベース オブジェクトを使用して自動的に作成されます。
Web サイトのアプリケーション固有のデータが格納されているのと同じデータベースにアプリケーション サービス データベース オブジェクトを作成することが可能であり、通常は理想的です。 .NET Frameworkには、指定したデータベースにデータベース オブジェクトをインストールする という名前aspnet_regsql.exe
のツールが付属しています。 先に進み、このツールを使用して、これらのオブジェクトを Reviews.mdf
フォルダー (開発データベース) のデータベースに App_Data
追加しました。 これらのオブジェクトを運用データベースに追加する場合は、このチュートリアルの後半でこのツールを使用する方法について説明します。
以外ASPNETDB
のデータベースにアプリケーション サービス データベース オブジェクトを追加する場合は、 および SqlRoleProvider
プロバイダー クラスの構成をSqlMembershipProvider
カスタマイズして、適切なデータベースを使用する必要があります。 Membership プロバイダーをカスタマイズするには、 セクションWeb.config
内に<メンバーシップ>要素を<system.web>
追加します。roleManager> 要素を<使用して Roles プロバイダーを構成します。 次のスニペットは、Book Reviews アプリケーションから Web.config
取得され、Membership API と Roles API の構成設定を示しています。 両方とも、 と プロバイダーReviewMembership
をそれぞれ使用SqlMembershipProvider
する新しいプロバイダー (およびReviewRole
SqlRoleProvider
) を登録します。
<configuration>
<system.web>
...
<membership defaultProvider="ReviewMembership">
<providers>
<clear />
<add type="System.Web.Security.SqlMembershipProvider"
name="ReviewMembership"
connectionStringName="ReviewsConnectionString"
applicationName="BookReviews" />
</providers>
</membership>
<roleManager enabled="true" defaultProvider="ReviewRole">
<providers>
<clear />
<add type="System.Web.Security.SqlRoleProvider"
name="ReviewRole"
connectionStringName="ReviewsConnectionString"
applicationName="BookReviews" />
</providers>
</roleManager>
...
</system.web>
</configuration>
Web.config
ファイルの 要素<authentication>
も、フォーム ベースの認証をサポートするように構成されています。
<configuration>
<system.web>
...
<authentication mode="Forms" />
...
</system.web>
</configuration>
管理ページへのアクセスの制限
ASP.NET を使用すると、 URL 承認 機能を使用して、ユーザーまたはロールによって特定のファイルまたはフォルダーへのアクセスを簡単に許可または拒否できます。 (「IIS と ASP.NET Development Server のコアの違い」チュートリアルで URL 承認について簡単に説明し、IIS と ASP.NET Development Server が静的コンテンツと動的コンテンツに対して URL 承認規則を異なる方法で適用する方法を示しました。管理 ロールのユーザーを除き、フォルダーへの~/Admin
アクセスを禁止するため、このフォルダーに URL 承認規則を追加する必要があります。 具体的には、URL 承認規則では、管理 ロールのユーザーを許可し、他のすべてのユーザーを拒否する必要があります。 これを行うには、次の内容の Web.config
ファイルを ~/Admin
フォルダーに追加します。
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<allow roles="Admin" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
ASP.NET の URL 承認機能の詳細と、それを使用してユーザーとロールの承認規則をスペル アウトする方法については、Web サイトセキュリティチュートリアルの「ユーザーベースの承認とロールベースの承認」のチュートリアルを参照してください。
Application Services を使用する Web アプリケーションのデプロイ
アプリケーション サービスを使用する Web サイトと、アプリケーション サービス情報をデータベースに格納するプロバイダーをデプロイする場合は、アプリケーション サービスに必要なデータベース オブジェクトを運用データベースに作成する必要があります。 最初は運用データベースにこれらのオブジェクトが含まれていないため、アプリケーションが最初にデプロイされたとき (または、アプリケーション サービスが追加された後に初めてデプロイされる場合) は、運用データベースでこれらの必要なデータベース オブジェクトを取得するための追加の手順を実行する必要があります。
開発環境で作成されたユーザー アカウントを運用環境にレプリケートする場合は、アプリケーション サービスを使用する Web サイトをデプロイするときに、もう 1 つの課題が発生する可能性があります。 メンバーシップとロールの構成によっては、開発環境で作成されたユーザー アカウントを運用環境のデータベースに正常にコピーした場合でも、これらのユーザーは運用環境で Web アプリケーションにサインインできない可能性があります。 この問題の原因を見て、発生を防ぐ方法について説明します。
ASP.NET には、Visual Studio から起動できる優れた Web サイト管理ツール (WSAT) が付属しており、ユーザー アカウント、ロール、および承認規則を Web ベースのインターフェイスを介して管理できます。 残念ながら、WSAT はローカル Web サイトでのみ機能します。つまり、運用環境で Web アプリケーションのユーザー アカウント、ロール、承認規則をリモートで管理することはできません。 運用 Web サイトから WSAT のような動作を実装するさまざまな方法について説明します。
aspnet_regsql.exeを使用したデータベース オブジェクトの追加
データベースの配置に関するチュートリアルでは、開発データベースから運用データベースにテーブルとデータをコピーする方法について説明しました。これらの手法を使用して、アプリケーション サービス データベース オブジェクトを運用データベースにコピーできます。 もう 1 つのオプションは aspnet_regsql.exe
、アプリケーション サービス データベース オブジェクトをデータベースに追加または削除するツールです。
注意
ツールは aspnet_regsql.exe
、指定したデータベースにデータベース オブジェクトを作成します。 これらのデータベース オブジェクト内のデータは、開発データベースから運用データベースに移行されません。 開発データベースのユーザー アカウントとロール情報を運用データベースにコピーする場合は、「データベースの配置」チュートリアルで説明されている手法 を 使用します。
ツールを使用して運用データベースにデータベース オブジェクトを追加する方法を aspnet_regsql.exe
見てみましょう。 まず、Windows エクスプローラーを開き、コンピューターの .NET Framework バージョン 2.0 ディレクトリ %WINDIR%\ Microsoft.NET\Framework\v2.0.50727 に移動します。 ツールが aspnet_regsql.exe
見つかります。 このツールはコマンド ラインから使用できますが、グラフィカル ユーザー インターフェイスも含まれています。ファイルを aspnet_regsql.exe
ダブルクリックしてグラフィカル コンポーネントを起動します。
ツールは、その目的を説明するスプラッシュスクリーンを表示することから始まります。 [次へ] をクリックして、図 1 に示す [セットアップ オプションの選択] 画面に進みます。 ここから、アプリケーション サービス データベース オブジェクトを追加するか、データベースから削除することを選択できます。 これらのオブジェクトを運用データベースに追加するため、[アプリケーション サービスのSQL Serverの構成] オプションを選択し、[次へ] をクリックします。
図 1: Application Services のSQL Serverの構成を選択する (フルサイズの画像を表示するをクリックします)
[サーバーとデータベースの選択] 画面で、データベースに接続するための情報を求めるメッセージが表示されます。 Web ホスティング会社から提供されたデータベース サーバー、セキュリティ資格情報、およびデータベース名を入力し、[次へ] をクリックします。
注意
データベース サーバーと資格情報を入力すると、データベース ドロップダウン リストを展開するときにエラーが発生する可能性があります。 このツールは aspnet_regsql.exe
システム テーブルに対してクエリを sysdatabases
実行してサーバー上のデータベースの一覧を取得しますが、一部の Web ホスティング会社はデータベース サーバーをロックダウンして、この情報が一般公開されないようにしています。 このエラーが発生した場合は、ドロップダウン リストにデータベース名を直接入力できます。
図 2: データベースの接続情報をツールに提供する (フルサイズの画像を表示する をクリックします)
次の画面は、実行されるアクション (つまり、アプリケーション サービス データベース オブジェクトが指定されたデータベースに追加される) をまとめたものです。 [次へ] をクリックして、このアクションを完了します。 しばらくすると、最後の画面が表示され、データベース オブジェクトが追加されたことが示されます (図 3 を参照)。
図 3: 成功! Application Services データベース オブジェクトが運用データベースに追加されました (フルサイズの画像を表示する場合は、ここをクリックします)
アプリケーション サービス データベース オブジェクトが実稼働データベースに正常に追加されたことを確認するには、SQL Server Management Studioを開き、運用データベースに接続します。 図 4 に示すように、データベース、、、aspnet_Applications
aspnet_Membership
aspnet_Users
、などのアプリケーション サービス データベース テーブルが表示されます。
図 4: データベース オブジェクトが実稼働データベースに追加されたことを確認する (フルサイズの画像を表示する をクリックします)
このツールは、初めて、またはアプリケーション サービスの使用 aspnet_regsql.exe
を開始した後に初めて Web アプリケーションをデプロイする場合にのみ使用する必要があります。 これらのデータベース オブジェクトが運用データベースに存在する場合、再追加や変更は必要ありません。
開発から運用へのユーザー アカウントのコピー
および プロバイダー クラスをSqlMembershipProvider
使用してアプリケーション サービス情報をSQL Server データベースに格納する場合、ユーザー アカウントとロール情報は、、aspnet_Roles
aspnet_Membership
aspnet_UsersInRoles
、 などaspnet_Users
、さまざまなデータベース テーブルに格納されます。SqlRoleProvider
開発中に開発環境でユーザー アカウントを作成する場合は、該当するデータベース テーブルから対応するレコードをコピーすることで、運用環境でそれらのユーザー アカウントをレプリケートできます。 データベース発行ウィザードを使用してアプリケーション サービス データベース オブジェクトを展開した場合は、レコードのコピーを選択した可能性もあります。これにより、開発中に作成されたユーザー アカウントも運用環境に配置されます。 ただし、構成設定によっては、開発中に作成され、運用環境にコピーされたアカウントを持つユーザーが、運用 Web サイトからログインできない場合があります。 何のためでしょう。
および SqlRoleProvider
プロバイダー クラスはSqlMembershipProvider
、1 つのデータベースが複数のアプリケーションのユーザー ストアとして機能するように設計されています。各アプリケーションでは、理論的には、ユーザー名とロールが重複するユーザーを同じ名前で持つことができます。 この柔軟性を実現するために、データベースはテーブル内のアプリケーションの一覧を aspnet_Applications
保持し、各ユーザーはこれらのアプリケーションのいずれかに関連付けられています。 具体的には、テーブルには aspnet_Users
、各ユーザーを ApplicationId
テーブル内のレコードに結び付ける列があります aspnet_Applications
。
列に ApplicationId
加えて、 aspnet_Applications
テーブルには列も含まれています ApplicationName
。この列には、アプリケーションのわかりやすい名前が提供されます。 Web サイトがログイン ページからユーザーの資格情報を検証するなど、ユーザー アカウントを操作しようとすると、どのアプリケーションを操作するかがクラスに通知 SqlMembershipProvider
される必要があります。 これは通常、アプリケーション名を指定することによって行われます。この値は、 Web.config
のプロバイダーの構成 (特に 属性を applicationName
介して) から取得されます。
しかし、 属性が applicationName
で Web.config
指定されていない場合はどうなりますか? このような場合、メンバーシップ システムは値としてアプリケーション ルート パスを applicationName
使用します。 属性が applicationName
で Web.config
明示的に設定されていない場合、開発環境と運用環境で別のアプリケーション ルートが使用されるため、アプリケーション サービス内の異なるアプリケーション名に関連付けられる可能性があります。 このような不一致が発生した場合、開発環境で作成されたユーザーの ApplicationId
値が運用環境の ApplicationId
値と一致しません。 その結果、これらのユーザーはログインできなくなります。
注意
この状況 (一致しない値を使用して運用環境にコピーされたユーザー アカウント) に気付いた場合は、これらの正しくないApplicationId
値を運用環境で使用されている ApplicationId
に更新するクエリをApplicationId
作成できます。 更新後、開発環境でアカウントが作成されたユーザーは、運用環境で Web アプリケーションにサインインできるようになります。
良いニュースは、2 つの環境で同じ ApplicationId
が使用されるようにするために実行できる簡単な手順があることです。すべてのアプリケーション サービス プロバイダーにWeb.config
対して 属性をapplicationName
明示的に設定します。 このスニペットWeb.config
が示すように、 applicationName
要素と <roleManager>
要素で <membership>
属性を "BookReviews" に明示的に設定します。
<membership defaultProvider="ReviewMembership">
<providers>
<clear />
<add type="System.Web.Security.SqlMembershipProvider"
name="ReviewMembership"
connectionStringName="ReviewsConnectionString"
applicationName="BookReviews" />
</providers>
</membership>
属性の設定 applicationName
とその背後にある根拠の詳細については、 Scott Guthrie のブログ記事「 ASP.NET メンバーシップやその他のプロバイダーを構成するときに常に applicationName プロパティを設定する」を参照してください。
運用環境でのユーザー アカウントの管理
ASP.NET Web サイト管理ツール (WSAT) を使用すると、ユーザー アカウントの作成と管理、ロールの定義と適用、ユーザーベースおよびロールベースの承認規則のスペルを簡単に行うことができます。 Visual Studio から WSAT を起動するには、ソリューション エクスプローラーに移動し、[ASP.NET 構成] アイコンをクリックするか、[Web サイト] メニューまたは [プロジェクト] メニューに移動し、[ASP.NET 構成] メニュー項目を選択します。 残念ながら、WSAT はローカル Web サイトでのみ機能します。 そのため、ワークステーションから WSAT を使用して、運用環境で Web サイトを管理することはできません。
WSAT によって提供されるすべての機能は、Membership API と Roles API を通じてプログラムで利用できます。さらに、WSAT 画面の多くは、標準の ASP.NET ログイン関連のコントロールを使用しています。 つまり、必要な管理機能を提供する ASP.NET ページを Web サイトに追加できます。
以前のチュートリアルでは、Book Reviews Web アプリケーションを更新してフォルダーを~/Admin
含め、このフォルダーは管理ロールのユーザーのみを許可するように構成されていることを思い出してください。 管理者が新しいユーザー アカウントを作成できる という名前 CreateAccount.aspx
のページをそのフォルダーに追加しました。 このページでは、CreateUserWizard コントロールを使用して、新しいユーザー アカウントを作成するためのユーザー インターフェイスとバックエンド ロジックを表示します。 さらに、新しいユーザーを管理ロールに追加するかどうかを確認する CheckBox を含むようにコントロールをカスタマイズしました (図 5 を参照)。 少しの作業で、WSAT によって提供されるユーザーおよびロール管理関連のタスクを実装するカスタム ページ のセットを構築できます。
注意
メンバーシップとロールの API とログイン関連の ASP.NET Web コントロールの使用の詳細については、「 Web サイトセキュリティチュートリアル」を参照してください。 CreateUserWizard コントロールのカスタマイズの詳細については、「Createing User Accounts and Storing Additional User Information」のチュートリアルを参照するか、Erich Peterson の「CreateUserWizard コントロールのカスタマイズ」をチェック。
図 5: 管理者は新しいユーザー アカウントを作成できます (クリックするとフルサイズの画像が表示されます)
WSAT チェック Rolling Your Own Web Site Administration Tool の完全な機能が必要な場合は、作成者 Dan Clem がカスタム WSAT のようなツールを構築するプロセスについて説明します。 Dan は、アプリケーションのソース コード (C#) を共有し、ホストされている Web サイトに追加するための詳細な手順を提供します。
まとめ
アプリケーション サービス データベースの実装を使用する Web アプリケーションをデプロイする場合は、まず運用データベースに必要なデータベース オブジェクトがあることを確認する必要があります。 これらのオブジェクトは、 データベースの配置 に関するチュートリアルで説明されている手法を使用して追加できます。または、このチュートリアルで aspnet_regsql.exe
説明したように、ツールを使用することもできます。 開発環境と運用環境で使用されるアプリケーション名の同期 (開発環境で作成されたユーザーとロールを運用環境で有効にする場合に重要) と、運用環境でユーザーとロールを管理するための手法の同期に関するその他の課題について中心に触れました。
プログラミングに満足!
もっと読む
このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示