次の方法で共有


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

作成者: Scott Mitchell

注意

この記事が作成されて以来、ASP.NET メンバーシップ プロバイダーは 、ASP.NET ID に置き換えられました。 この記事の執筆時点で取り上げられたメンバーシップ プロバイダーではなく 、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。ほとんどの場合、 Web パーツで使用されます。
  • 正常性の監視 - 実行中の 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 アプリケーションには、データベース内の および Books テーブルのデータGenresからサイト マップを構築する Site Map API (ReviewSiteMapProvider) のカスタム プロバイダーが既に含まれています。

このチュートリアルでは、まず、メンバーシップ API とロール API を使用するように Book Reviews Web アプリケーションを拡張する方法について説明します。 次に、SQL Server データベース実装でアプリケーション サービスを使用する Web アプリケーションをデプロイする手順を説明し、運用環境でのユーザー アカウントとロールの管理に関する一般的な問題に対処します。

書籍レビュー アプリケーションに更新する

過去 2 つのチュートリアルで、ブック レビュー Web アプリケーションは静的 Web サイトから動的なデータドリブン Web アプリケーションに更新され、ジャンルとレビューを管理するための一連の管理ページが完成しました。 ただし、この管理セクションは現在保護されていません。管理ページの URL を知っている (または推測する) ユーザーは、サイトでレビューを作成、編集、または削除できます。 Web サイトの特定の部分を保護する一般的な方法は、ユーザー アカウントを実装してから、URL 承認規則を使用して特定のユーザーまたはロールへのアクセスを制限することです。 このチュートリアルでダウンロードできる Book Reviews Web アプリケーションは、ユーザー アカウントとロールをサポートしています。 管理という名前の 1 つのロールが定義されており、このロールのユーザーのみが管理ページにアクセスできます。

注意

ブック レビュー Web アプリケーションで、Scott、Jisun、Alice の 3 つのユーザー アカウントを作成しました。 3 人のユーザーはすべて同じパスワードを持っています: password!Scott と Jisun は管理の役割を果たしており、Alice は役割を果たしていません。 サイトの管理以外のページには、匿名ユーザーが引き続きアクセスできます。 つまり、サイトを管理しない限り、サイトにアクセスするためにサインインする必要はありません。その場合は、管理ロールのユーザーとしてサインインする必要があります。

Book Reviews アプリケーションのマスター ページが更新され、認証されたユーザーと匿名ユーザー用の別のユーザー インターフェイスが含まれています。 匿名ユーザーがサイトにアクセスすると、右上隅にログイン リンクが表示されます。 認証されたユーザーには、"ようこそ、 ユーザー名!" というメッセージと、ログアウトするためのリンクが表示されます。ログイン ページ (~/Login.aspx) もあります。このページには、訪問者を認証するためのユーザー インターフェイスとロジックを提供する Login Web コントロールが含まれています。 管理者のみが新しいアカウントを作成できます。 (フォルダー内のユーザー アカウント ~/Admin を作成および管理するためのページがあります)。

メンバーシップ API とロール API の構成

Book Reviews Web アプリケーションでは、メンバーシップ API とロール API を使用してユーザー アカウントをサポートし、それらのユーザーをロール (つまり、管理 ロール) にグループ化します。 SqlMembershipProviderおよび SqlRoleProvider プロバイダー クラスは、アカウントとロールの情報をSQL Server データベースに格納するため使用されます。

注意

このチュートリアルは、メンバーシップ API とロール API をサポートするように Web アプリケーションを構成する際の詳細な調査を目的としたものではありません。 これらの API と、それらを使用するように 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カスタマイズして、適切なデータベースを使用する必要があります。 メンバーシップ プロバイダーをカスタマイズするには、 セクション内にWeb.config<メンバーシップ>要素<system.web>追加します。roleManager> 要素を<使用して Roles プロバイダーを構成します。 次のスニペットは、Book Reviews アプリケーション Web.config から取得され、メンバーシップ API とロール API の構成設定を示しています。 と プロバイダーをそれぞれ使用SqlRoleProviderSqlMembershipProviderする新しいプロバイダーReviewMembershipReviewRole 、 の両方が登録されることに注意してください。

<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 開発サーバーが静的コンテンツと動的コンテンツに対して 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 介して) から取得されます。

しかし、 で属性が applicationName 指定 Web.configされていない場合はどうなりますか? このような場合、メンバーシップ システムは値としてアプリケーション ルート パスを applicationName 使用します。 属性が applicationNameWeb.config明示的に設定されていない場合は、開発環境と運用環境で異なるアプリケーション ルートが使用されるため、アプリケーション サービス内の異なるアプリケーション名に関連付けられる可能性があります。 このような不一致が発生した場合、開発環境で作成されたユーザーは、運用環境の値とApplicationId一致しない値を持ApplicationIdちます。 その結果、これらのユーザーはログインできなくなります。

注意

この状況で、ユーザー アカウントが運用環境にコピーされ、値が一致しない場合は、これらの正しくないApplicationId値を運用環境で使用されている ApplicationId に更新するクエリをApplicationId記述できます。 更新されると、開発環境でアカウントが作成されたユーザーは、運用環境で Web アプリケーションにサインインできるようになります。

良いニュースは、2 つの環境で同じ ApplicationId を使用するようにするための簡単な手順があることです。すべてのアプリケーション サービス プロバイダーに対して 属性を applicationName 明示的に に Web.config 設定します。 このスニペット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 によって提供されるすべての機能が、メンバーシップ API とロール API を通じてプログラムで使用できるということです。さらに、WSAT 画面の多くは、標準の ASP.NET ログイン関連のコントロールを使用しています。 つまり、必要な管理機能を提供する ASP.NET ページを Web サイトに追加できます。

以前のチュートリアルでは、Book Reviews Web アプリケーションを更新してフォルダーを~/Admin含め、このフォルダーは管理ロールのユーザーのみを許可するように構成されていることを思い出してください。 管理者が新しいユーザー アカウントを作成できる という名前 CreateAccount.aspx のページをそのフォルダーに追加しました。 このページでは、CreateUserWizard コントロールを使用して、新しいユーザー アカウントを作成するためのユーザー インターフェイスとバックエンド ロジックを表示します。 さらに、新しいユーザーを管理ロールに追加するかどうかを確認する CheckBox を含むようにコントロールをカスタマイズしました (図 5 を参照)。 少しの作業で、WSAT によって提供されるユーザーおよびロール管理関連のタスクを実装するカスタム ページ セットを構築できます。

注意

メンバーシップ API とロール API とログイン関連の ASP.NET Web コントロールの使用の詳細については、「 Web サイト セキュリティ チュートリアル」を参照してください。 CreateUserWizard コントロールのカスタマイズの詳細については、ユーザー アカウントの作成追加のユーザー情報の保存に関するチュートリアルを参照するか、Erich Peterson の記事「CreateUserWizard コントロールのカスタマイズ」をチェックします。

管理者は新しいユーザー アカウントを作成できます

図 5: 管理者は新しいユーザー アカウントを作成できます (クリックするとフルサイズの画像が表示されます)

WSAT チェック Rolling Your Own Web Site Administration Tool の完全な機能が必要な場合は、作成者 Dan Clem がカスタム WSAT に似たツールを構築するプロセスについて説明します。 Dan は、アプリケーションのソース コード (C#) を共有し、ホストされている Web サイトに追加するための詳細な手順を提供します。

まとめ

アプリケーション サービス データベースの実装を使用する Web アプリケーションをデプロイする場合は、まず運用データベースに必要なデータベース オブジェクトがあることを確認する必要があります。 これらのオブジェクトは、 データベースの配置 に関するチュートリアルで説明されている手法を使用して追加できます。または、このチュートリアルで aspnet_regsql.exe 説明したように、ツールを使用することもできます。 開発環境と運用環境で使用されるアプリケーション名の同期 (開発環境で作成されたユーザーとロールを運用環境で有効にする場合に重要) と、運用環境でユーザーとロールを管理するための手法を中心に説明しました。

幸せなプログラミング!

もっと読む

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