運用 Web サイトのユーザーとロール (C#)
Note
この記事が作成された後で、ASP.NET メンバーシップ プロバイダーは ASP.NET Identity に置き換えられました。 アプリを更新し、この記事の作成時点で紹介したメンバーシップ プロバイダーではなく、ASP.NET Identity プラットフォームを使用することを強く推奨します。 ASP.NET メンバーシップ システムと比べると、ASP.NET Identity には次のような多くの利点があります。
- パフォーマンスの向上
- 向上した拡張性とテストの容易性
- OAuth、OpenID Connect、2 要素認証のサポート
- クレームベースの ID のサポート
- ASP.Net Core との相互運用性の向上
ASP.NET Web サイト管理ツール (WSAT) には、メンバーシップとロールの設定を構成し、ユーザーとロールを作成、編集、削除するための Web ベースのユーザー インターフェイスが用意されています。 残念ながら、WSAT は localhost からアクセスした場合にのみ機能します。つまり、ブラウザーから運用 Web サイトの管理ツールにアクセスすることはできません。 朗報は、運用環境でユーザーとロールを管理できるようにする回避策があることです。 このチュートリアルでは、これらの回避策とその他の事項について説明します。
はじめに
ASP.NET 2.0 では、多数のアプリケーション サービスが導入されました。これは、Web アプリケーションに追加できる一連の構成要素サービスです。 「アプリケーション サービスを使用する Web サイトを構成する」チュートリアルで、書籍レビュー用の Web サイトにメンバーシップサービスとロール サービスを追加しました。 メンバーシップ サービスは、ユーザー アカウントの作成と管理を容易にするためのものです。ロール サービスには、ユーザーをグループに分類するための API が用意されています。 書籍レビュー サイトには、Scott、Jisun、Alice の 3 つのユーザー アカウントと、Admin の 1 つのロールがあり、Admin ロールに Scott と Jisun が属しています。
ASP.NET のアプリケーション サービスは、特定の実装には関連付けられていません。 代わりに、特定のプロバイダーを使用するようにアプリケーション サービスに指示し、そのプロバイダーは特定のテクノロジを使用してサービスを実装します。 書籍レビュー Web サイト アプリケーションは、メンバーシップ サービスとロール サービスのために、SqlMembershipProvider
プロバイダーと SqlRoleProvider
プロバイダーを使用するように構成しました。 これら 2 つのプロバイダーは、ユーザー アカウントとロール情報を SQL Server データベースに格納するもので、Web ホスティング会社でホストされているインターネット ベースの Web アプリケーションで最もよく使用されているプロバイダーです。
メンバーシップ サービスおよびロール サービスを使用する開発者にとって一般的な課題は、運用環境でユーザーとロールを管理することです。 運用 Web サイトからユーザー アカウントを削除し、新しいロールを追加し、既存のユーザーを既存のロールに追加するには、どうすればよいでしょうか。 このチュートリアルでは、運用 Web サイトでユーザーとロールを管理するためのさまざまな手法について説明します。
ASP.NET Web サイト管理ツールの使用
ASP.NET には、ユーザー アカウントとロールの作成と管理、およびユーザーベースとロールベースの認可規則の指定を容易にする Web サイト管理ツール (WSAT) が用意されています。 WSAT を使用するには、ソリューション エクスプローラーで [ASP.NET 構成] アイコンをクリックするか、Web サイト メニューまたはプロジェクト メニューに移動し、ASP.NET 構成オプションを選択します。 どちらの方法でも Web ブラウザーが起動し、ブラウザーは http://localhost:portNumber/asp.netwebadminfiles/default.aspx?applicationPhysicalPath=pathToApplication
などのアドレスの WSAT にポイントされます。
WSAT は、次の 3 つのセクションに分かれています。
- Security - ユーザー、ロール、認可規則を管理します。
- ApplicationConfiguration - ここから <appSettings> と SMTP 設定を管理します。 アプリケーションをオフラインにして、ここからデバッグとトレースの設定を管理し、既定のカスタム エラー ページを指定することもできます。
- ProviderConfiguration - アプリケーション サービスによって使用されるプロバイダーを構成します。
[Security] セクション (図 1 を参照) には、新しいユーザーの作成、ユーザーの管理、ロールの作成と管理、アクセス規則の作成と管理に関するリンクが含まれています。 ここから、システムに新しいロールを追加し、既存のユーザーを削除し、特定のユーザー アカウントのロールを追加または削除できます。
図 1: WSAT の [Security] セクションに、ユーザーとロールを管理するためのオプションが含まれている
(クリックするとフルサイズの画像が表示されます)
残念ながら、WSAT はローカルからのみアクセスできます。 リモート運用 Web サイトで WSAT にアクセスすることはできません。www.yoursite.com/asp.netwebadminfiles/default.aspx
にアクセスすると、"404 見つかりません" 応答が返されます。 WSAT を機能させるコードでは、.NET Framework で Membership
クラスと Roles
クラスを使用して、ユーザーとロールを作成、編集、削除します。 これらのクラスは、Web アプリケーションの構成情報を参照して、使用するプロバイダーを決定します。以前の「アプリケーション サービスを使用する Web サイトを構成する」チュートリアルで、SqlMembershipProvider
プロバイダーと SqlRoleProvider
プロバイダーを使用するために、書籍レビュー Web サイトをセットアップしました。 これには、<membership>
セクションと <roleManager>
セクションを Web.config
に追加する必要がありました。
<?xml version="1.0"?>
<configuration>
...
<connectionStrings configSource="ConfigSections\databaseConnectionStrings.config" />
<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>
<membership>
セクションと <roleManager>
セクションは、type
属性の SqlMembershipProvider
プロバイダーと SqlRoleProvider
プロバイダーをそれぞれ参照することに注意してください。 これらのプロバイダーは、指定された SQL Server データベースにユーザーとロールの情報を格納します。 これらのプロバイダーによって使用されるデータベースは、connectionStringName
属性である ReviewsConnectionString
によって指定されます。これは、~/ConfigSections/databaseConnectionStrings.config
ファイルで定義されています。 開発環境の databaseConnectionStrings.config
ファイルに開発データベースへの接続文字列が含まれているのに対し、運用環境の databaseConnectionStrings.config
ファイルに運用データベースへの接続文字列が含まれていることを思い出してください。
簡単に言うと、WSAT はローカルで開発環境を介してアクセスする必要があり、databaseConnectionStrings.config
ファイル内で指定されたデータベース内のユーザーとロールの情報を扱います。 そのため、開発環境で databaseConnectionStrings.config
ファイル内の接続文字列情報を変更した場合は、WSAT をローカルで使用して、運用環境のユーザーとロールを管理できます。
この機能を理解するため、開発環境の Visual Studio で databaseConnectionStrings.config
ファイルを開き、開発データベースの接続文字列を運用データベースの接続文字列に置き換えます。 次に、WSAT を起動し、[Security] タブに移動し、パスワード "password!" (引用符なし) を使用して Sam という名前の新しいユーザーを追加します。 図 2 は、このアカウントを作成するときの WSAT 画面を示しています。
図 2: 運用環境で Sam という名前の新しいユーザーを作成する
(クリックするとフルサイズの画像が表示されます)
運用環境のデータベース サーバーを指すように databaseConnectionStrings.config
の接続文字列を変更したため、Sam は運用環境のユーザーとして追加されました。 これを確認するには、databaseConnectionStrings.config
ファイル内の接続文字列を開発データベースに戻し、開発環境の Login.aspx
ページにアクセスします。 Sam としてサインインしてみてください (図 3 を参照)。
図 3: 開発環境で Sam としてサインインできない
(クリックするとフルサイズの画像が表示されます)
ユーザー アカウント情報がローカル データベースに存在しないため、開発環境で Sam としてサインインすることはできません。 そこではなく、運用データベースに追加されました。 これを確認するには、開発データベースと運用データベースの両方の aspnet_Users
テーブルの内容を参照します。 開発環境では、ユーザーのレコードは Scott、Jisun、Alice の 3 つのみです。 ただし、運用データベースの aspnet_Users
テーブルには、Scott、Jisun、Alice、Sam の 4 つのレコードがあります。 その結果、Sam は運用環境で Web サイトを介してサインインできますが、開発環境ではサインインできません。
図 4: Sam は運用 Web サイトにサインインできる
(クリックするとフルサイズの画像が表示されます)
Note
WSAT の操作が完了したら、databaseConnectionStrings.config
ファイル内の接続文字列を変更し、開発データベースの接続文字列に戻すことを忘れないでください。そうしないと、開発環境を使用してサイトをテストするときに、運用データを操作することになります。 また、先ほど説明した手法では、WSAT を使用してユーザーとロールをリモートで管理できる一方で、他の何らかの WSAT 構成オプション (アクセス規則、SMTP 設定、デバッグおよびトレース設定など) を変更すると、Web.config
ファイルが変更される点にも注意が必要です。 結果として、設定に加えられた変更は開発環境に適用され、運用環境には適用されません。
カスタム ユーザーおよびロール管理の Web ページの作成
WSAT は、ユーザーとロールを管理するためのすぐに使用できるシステムを提供しますが、ローカルでのみ起動でき、運用環境でユーザーとロールを管理するには、接続文字列情報を変更する必要があります。 ユーザー アカウントをサポートするほとんどの Web サイトには、管理者がサイト内のページからユーザーとロールを管理できるようにする多数のユーザーおよびロール管理のための Web ページも含まれています。 このような Web ベースの管理ページを使用すると、ユーザーとロールの管理がはるかに簡単になります。また、管理者が多いサイトや、Visual Studio を使用して WSAT を起動するためのアクセス権を持たない、またはそのための技術的知識がない管理者がいるサイトには不可欠です。
ASP.NET には、これらの管理 Web ページの多くをドラッグ アンド ドロップのような簡単な操作で実装できるログイン関連の Web コントロールが多数組み込まれています。 たとえば、CreateUserWizard コントロールをページにドラッグし、いくつかのプロパティを設定することで、管理者が新しいユーザー アカウントを作成するためのページを作成できます。 実際、図 2 に示す WSAT のユーザー作成用のページには、独自に作成するページに追加できるのと同じ CreateUserWizard コントロールが使用されています。 さらに、メンバーシップ サービスおよびロール サービスの機能は、.NET Framework の Membership
クラスと Roles
クラスを介してプログラムによって使用できます。 これらのクラスを使用すると、ユーザーとロールの作成、編集、削除、ユーザーのロールへの追加または削除、ユーザーがどのロールに属しているかの判断、その他のユーザーおよびロール関連のタスクの実行などのためのコードを記述できます。
「アプリケーション サービスを使用する Web サイトを構成する」チュートリアルで、CreateAccount.aspx
という名前の Admin
フォルダーにページを追加しました。 このページでは、管理者がサイトに新しいユーザー アカウントを追加し、新しく作成したユーザーが管理者ロールに含まれているかどうかを指定できます (図 5 を参照)。
図 5: 管理者は新しいユーザー アカウントを作成できる
(クリックするとフルサイズの画像が表示されます)
ユーザーとロールの管理ページの構築、Membership
クラスと Roles
クラスの使用に関する詳細な手順、ログイン関連の ASP.NET Web コントロールの詳細は、筆者の「Web サイトのセキュリティに関するチュートリアル」をぜひお読みください。 ここに、新しいアカウントの作成、ロールの作成と管理、ロールへのユーザーの割り当て、その他の一般的な管理タスクに関する Web ページの構築方法のガイダンスがあります。
運用 Web サイトに WSAT のような機能を実装するには、独自の一連の Web ページをいつでも構築でき、そこに WSAT の機能を実装できます。 これを構築するためのベースとして、%WINDIR%\Microsoft.NET\Framework\v2.0.50727\ASP.NETWebAdminFiles
フォルダーにある WSAT のソース コードを活用できます。 もう 1 つの方法は、Dan Clem による WSAT の代替手段を使用することです。これには、Dan が公開している「独自の Web サイト管理ツールのローリング」記事を参照できます。 Dan はこの記事の中で WSAT のようなカスタム ツールを構築するプロセスについて説明し、ダウンロード用のアプリケーションのソース コード (C#) を含め、ホストされている Web サイトにカスタム WSAT を追加するための詳細な手順を説明しています。
まとめ
ASP.NET Web サイト管理ツール (WSAT) は、メンバーシップとロールの各アプリケーション サービスと組み合わせて使用して、Web サイトのユーザーとロールの情報を管理できます。 残念ながら、WSAT はローカルからのみアクセスでき、運用 Web サイトからはアクセスできません。 ただし、運用環境のデータベースを指すように開発環境の接続文字列を変更することで、WSAT を使用して運用 Web サイトのユーザーとロールを管理できます。
WSAT の方法を使用すると、ユーザーとロールをすばやく簡単に管理できるようになりますが、Visual Studio から WSAT を起動し、接続文字列情報を一時的に変更する必要があります。 WSAT は、運用環境でユーザーとロールを簡単に管理する方法を提供しますが、それには面倒が伴い、管理者が複数いる環境や、Visual Studio と WSAT を持っていない、または使い慣れていない管理者がいる Web サイトではうまく機能しません。 このような理由から、ユーザー アカウントをサポートするほとんどの Web サイトには、一連の管理 Web ページが用意されます。 このような一連の Web ページを用意することで、WSAT が不要になり、あらゆるコンピューターからさまざまな管理ユーザーが使用できます。
プログラミングに満足!
もっと読む
この記事で説明したトピックの詳細については、次のリソースを参照してください。
- ASP.NET のメンバーシップ、ロール、プロファイルの確認
- 独自の Web サイト管理ツールのローリング
- Web サイト管理ツール概要
- Web サイトのセキュリティに関するチュートリアル