アプリケーション サービスを使用する Web サイトを構成する (C#)

作成者: Scott Mitchell

注意

この記事が作成されて以来、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アプリケーションのフォルダーにある という名前ASPNETDBApp_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する新しいプロバイダー (およびReviewRoleSqlRoleProvider) を登録します。

<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の構成] オプションを選択し、[次へ] をクリックします。

Application Services のSQL Serverの構成を選択する

図 1: Application Services のSQL Serverの構成を選択する (フルサイズの画像を表示するをクリックします)

[サーバーとデータベースの選択] 画面で、データベースに接続するための情報を求めるメッセージが表示されます。 Web ホスティング会社から提供されたデータベース サーバー、セキュリティ資格情報、およびデータベース名を入力し、[次へ] をクリックします。

注意

データベース サーバーと資格情報を入力すると、データベース ドロップダウン リストを展開するときにエラーが発生する可能性があります。 このツールは aspnet_regsql.exe システム テーブルに対してクエリを sysdatabases 実行してサーバー上のデータベースの一覧を取得しますが、一部の Web ホスティング会社はデータベース サーバーをロックダウンして、この情報が一般公開されないようにしています。 このエラーが発生した場合は、ドロップダウン リストにデータベース名を直接入力できます。

データベースの接続情報をツールに提供する

図 2: データベースの接続情報をツールに提供する (フルサイズの画像を表示する をクリックします)

次の画面は、実行されるアクション (つまり、アプリケーション サービス データベース オブジェクトが指定されたデータベースに追加される) をまとめたものです。 [次へ] をクリックして、このアクションを完了します。 しばらくすると、最後の画面が表示され、データベース オブジェクトが追加されたことが示されます (図 3 を参照)。

成功!Application Services データベース オブジェクトが運用データベースに追加されました

図 3: 成功! Application Services データベース オブジェクトが運用データベースに追加されました (フルサイズの画像を表示する場合は、ここをクリックします)

アプリケーション サービス データベース オブジェクトが実稼働データベースに正常に追加されたことを確認するには、SQL Server Management Studioを開き、運用データベースに接続します。 図 4 に示すように、データベース、、、aspnet_Applicationsaspnet_Membershipaspnet_Users、などのアプリケーション サービス データベース テーブルが表示されます。

データベース オブジェクトが実稼働データベースに追加されたことを確認する

図 4: データベース オブジェクトが実稼働データベースに追加されたことを確認する (フルサイズの画像を表示する をクリックします)

このツールは、初めて、またはアプリケーション サービスの使用 aspnet_regsql.exe を開始した後に初めて Web アプリケーションをデプロイする場合にのみ使用する必要があります。 これらのデータベース オブジェクトが運用データベースに存在する場合、再追加や変更は必要ありません。

開発から運用へのユーザー アカウントのコピー

および プロバイダー クラスをSqlMembershipProvider使用してアプリケーション サービス情報をSQL Server データベースに格納する場合、ユーザー アカウントとロール情報は、、aspnet_Rolesaspnet_Membershipaspnet_UsersInRoles、 などaspnet_Users、さまざまなデータベース テーブルに格納されます。SqlRoleProvider 開発中に開発環境でユーザー アカウントを作成する場合は、該当するデータベース テーブルから対応するレコードをコピーすることで、運用環境でそれらのユーザー アカウントをレプリケートできます。 データベース発行ウィザードを使用してアプリケーション サービス データベース オブジェクトを展開した場合は、レコードのコピーを選択した可能性もあります。これにより、開発中に作成されたユーザー アカウントも運用環境に配置されます。 ただし、構成設定によっては、開発中に作成され、運用環境にコピーされたアカウントを持つユーザーが、運用 Web サイトからログインできない場合があります。 何のためでしょう。

および SqlRoleProvider プロバイダー クラスはSqlMembershipProvider、1 つのデータベースが複数のアプリケーションのユーザー ストアとして機能するように設計されています。各アプリケーションでは、理論的には、ユーザー名とロールが重複するユーザーを同じ名前で持つことができます。 この柔軟性を実現するために、データベースはテーブル内のアプリケーションの一覧を aspnet_Applications 保持し、各ユーザーはこれらのアプリケーションのいずれかに関連付けられています。 具体的には、テーブルには aspnet_Users 、各ユーザーを ApplicationId テーブル内のレコードに結び付ける列があります aspnet_Applications

列に ApplicationId 加えて、 aspnet_Applications テーブルには列も含まれています ApplicationName 。この列には、アプリケーションのわかりやすい名前が提供されます。 Web サイトがログイン ページからユーザーの資格情報を検証するなど、ユーザー アカウントを操作しようとすると、どのアプリケーションを操作するかがクラスに通知 SqlMembershipProvider される必要があります。 これは通常、アプリケーション名を指定することによって行われます。この値は、 Web.config のプロバイダーの構成 (特に 属性を applicationName 介して) から取得されます。

しかし、 属性が applicationNameWeb.config指定されていない場合はどうなりますか? このような場合、メンバーシップ システムは値としてアプリケーション ルート パスを applicationName 使用します。 属性が applicationNameWeb.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 説明したように、ツールを使用することもできます。 開発環境と運用環境で使用されるアプリケーション名の同期 (開発環境で作成されたユーザーとロールを運用環境で有効にする場合に重要) と、運用環境でユーザーとロールを管理するための手法の同期に関するその他の課題について中心に触れました。

プログラミングに満足!

もっと読む

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