6 人のうち 4 人が役に立つと評価しました    - このトピックを評価する

Visual Web Developer 2005 Express Edition と SQL Server 2005 Express Edition による Web 開発 (第 1 部)

セキュリティ : Visual Web Developer 2005 Express Edition と SQL Server 2005 Express Edition の統合

Dan Burman
Citigate Hudson

June 2004
日本語版最終更新日 2004 年 12 月 7 日

対象 :
   Microsoft ASP.NET 2.0
   Microsoft SQL Server 2005 Express Edition テクニカル プレビュー
   Microsoft Visual Basic 2005 Express Edition
   Microsoft Visual Web Developer 2005 Express Edition

概要 : Visual Web Developer 2005 Express Edition と SQL Server Express による Web アプリケーション作成に関する 3 部構成の資料の第 1 部では、プロジェクトのセットアップと SQL Server Express データベースの作成を取り上げ、ASP.NET Web Site Administration ツールを使用してロール、ユーザー、およびプロバイダを設定する方法について調べます。また、Login、LoginStatus、LoginView、CreateUserWizard、PasswordRecovery、ChangePassword などのセキュリティ コントロールの使用についても取り上げています。

   この資料は、2004 年 5 月時点の Visual Web Developer 2005 Express Edition のアルファ リリースと SQL Server 2005 Express Edition テクニカル プレビューに基づいています。ここに記載される情報は変更される可能性があります。

関連サンプル コード ExpressWebDevelopment.exe (英語) のダウンロード

目次

はじめに
概要
プロジェクトのセットアップ
ASP.NET Web サイト管理ツール
Web.config ファイルでのフォーム認証のセットアップ
データ エクスプローラの内部でのデータ接続のセットアップ
セキュリティ サーバー コントロール
まとめ

はじめに

みなさん、ようこそ。このシリーズのホワイト ペーパーでは Visual Web Developer 2005 Express Edition と SQL Server 2005 Express Edition テクニカル プレビューで提供している開発者向けの多数の機能を調査しています。このシリーズでは、学生の履修科目の登録状況を扱うサンプル アプリケーションを構築する経過を、順を追って詳しく説明します。学生は、このアプリケーションを使用して履修科目の登録と、登録している履修科目の予定表を参照することができます。運営委員会のメンバー (管理者) は、新しい履修科目をシステムに追加し、既存の各履修科目の登録状況を参照できます。学生は個人情報の入力と編集ができ、管理者は学生情報についてのレポート機能を実行して学校の運営に利用することができます。また、このサイトには、学校行事が掲示される公共のページもあります。

このシリーズの第 1 部では、SQL Server Express との併用により Visual Web Developer 2005 Express Edition で提供されるすべてのコンポーネントに注目します。サイトの管理者がさまざまなプロバイダ、アプリケーション ロール、およびユーザー アカウントを管理できるようにする新しい Web サイト管理ツールに注目します。これらが、ASP.NET 2.0 で提供される新しいセキュリティベースのサーバー コントロールとどれだけシームレスに統合されているのかを説明します。

第 2 部では、SQL Server Express でのデータ アクセスを調査します。テーブルとストアド プロシージャの作成方法、データ コンポーネントの使用による n 層アーキテクチャの実装方法、および ObjectDataSource によってプレゼンテーション層とのインターフェイスをとる方法を説明します。

このシリーズの 第 3 部では、Web サイトの中心となるページの作成方法を順を追って説明します。マスタ ページとコンテンツ ページを使用するテンプレートドリブンなサイトの作成方法を学習した後、サーバー コントロールをバインドしてデータ アクセス層と統合する方法を学習します。最後に、アプリケーションの配置に関する事項を学習します。

概要

開発者に提供される新しいセキュリティ機能は、Visual Web Developer 2005 Express Edition と SQL Server Express Edition の強力な統合によって導入された最も大きな強化点の 1 つです。ASP.NET 2.0 では、メンバシップ サービスが提供されます。このサービスでは、フォーム認証を処理するために、ユーザー アカウントとハッシュされたパスワードを備えたデータベース、ロール マネージャ、およびユーザー アカウントを統合するいくつかのサーバー側コントロールをサポートしており、開発者によるコーディングが不要です。また、ユーザー アカウントやロールを管理したり、データ プロバイダを確立したりするためのセキュリティ モデルを結び付ける強力な ASP.NET Web サイト管理ツールも提供されています。

この資料では、ユーザー ロールの管理、フォーム認証の確立、アプリケーション ユーザーのアカウントとロールのセットアップ、および強力なサーバー側コントロールとメンバシップ サービスとの統合を利用するための Web ページの構築を行うアプリケーション プロバイダとして SQL Server Express をするセットアップする過程を順を追って説明しています。

プロジェクトのセットアップ

Visual Web Developer 2005 Express Edition を使用して新しいプロジェクトを作成するのは簡単です。Visual Web Developer 2005 Express Edition を開き、[File] メニューの [New Web Site] をクリックして、インストールされた Visual Studio テンプレートの一覧で [ASP.NET Web Site] をクリックします。Web フォルダに "StudentActivities" という名前を付けて [OK] をクリックします。Web フォルダが作成され Visual Web Developer 2005 Express Edition に読み込まれると、開いた状態の Web フォルダがソリューション エクスプローラに表示されます。次に、フォルダ構造をセットアップして、開発するコードを効率よく組織化します。ソリューション エクスプローラで、ルート フォルダを右クリックして [New Folder] をクリックします。このフォルダの名前を "Code" に変更します。ASP.NET 2.0 側ではこのフォルダをアプリケーション内の他のフォームにアクセスできるデータ コンポーネントを含んでいるフォルダとして認識します (このシリーズの 第 2 部でデータ コンポーネントに関する詳細を説明しています)。

次に、"MasterPages" と "ContentPages" という 2 つのフォルダをプロジェクトに追加します。これらの名前は ASP.NET 2.0 にとっては特別な意味はないのですが、これらを使用してマスタ ページとコンテンツ ページをそれぞれ組織化します (このシリーズの 3 つ目の資料でマスタ ページとコンテンツ ページについて詳しく説明します)。最後に、データベースを Web プロジェクトに追加します。追加するには、新しい Web サイトを作成したときに追加された "Data" ディレクトリを右クリックします。次に、[Add New Item] をクリックします。ファイルの種類の一覧で、[Database] をクリックして、"StudentActivities.mdf" という名前に変更します。データベースが追加される際に、データ エクスプローラが開かれて新しい空のデータベースにアクセスするためのデータ接続が作成されます。

.MDF ファイルのログイン資格情報が、インストール中に SQL Server Express のセットアップに使用したログイン資格情報と一致しない場合、データベースに接続しようとしたときに問題が発生します。ログイン資格情報を一致させるには、StudentActivities.mdf の接続文字列を更新する必要がある場合があります。更新するには、データ エクスプローラでデータ接続を右クリックして [Modify Connection] をクリックします。[Connection Property] ダイアログ ボックスが開いたら、ログイン資格情報を SQL Server Express をインストールしたときのログイン資格情報と一致するように設定します。インストール時に混合モードを使用した場合は、ここでも混合モードを使用する必要があります。すべての資格情報を設定したら、[Test Connection] をクリックします。正常に接続できたら [OK] をクリックします。

図 1. ソリューション エクスプローラに表示されるプロジェクト フォルダ構造の図

この時点で、基本のフォルダ構造が作成されデータベースが追加されたので、メンバシップ プロバイダ、ユーザー ロール、およびアプリケーション ユーザーを設定する必要があります。

ASP.NET Web サイト管理ツール

ASP.NET Web サイト管理ツール (WSA) は ASP.NET 2.0 に導入された最も強力な強化点の 1 つです。このツールでは、Web アプリケーションの多彩な側面の保守や管理を可能にするシンプルかつ強力なグラフィカル インターフェイスを開発者に提供しています。この資料の目的から、既定のメンバシップ プロバイダの管理、ロールの管理、アカウント ユーザーの管理という 3 つの機能のみに注目しますが、ASP.NET 2.0 のその他の機能も WSA を使用して管理できます。

ASP.NET Web サイト管理ツールを Visual Web Developer 2005 Express Edition から開くには、[Web Site] メニューの [ASP.NET Configuration] をクリックします。

図 2. ASP.NET Web サイト管理ツールのメイン画面

この管理ツールが開くと、異なる 4 つのオプションが表示されます。

  • Security - サイトのユーザー、ロール、およびアクセス許可のセットアップと編集が可能です。
  • Profile - 一連のプロファイル プロパティを管理できるようにします。プロファイル プロパティの値はサイトの訪問者ごとに別々に格納されます。
  • Application Configuration - アプリケーションの構成設定を管理できます。
  • Provider Configuration - Web サイトで使用される管理データを格納する場所と、格納方法を指定できます。

この資料の目的から、"Security" オプションと "Provider Configuration" オプションのみを説明します。

プロバイダのセットアップ

最初に行う管理上の作業は、メンバシップ プロバイダのセットアップです。既定では、Visual Web Developer 2005 Express Edition により "AspNetDB.mdb" という Access データベースがインポートされます。ソリューション エクスプローラでは、"Data" フォルダ内にこのデータベースが表示されます。この資料では Visual Web Developer 2005 Express Edition と SQL Server Express との強力な統合を紹介することを目的としているので、プロバイダの処理には Access ではなく SQL Server Express を使用します。

ASP.NET 1.X アプリケーションでは、通常、ユーザー資格情報やユーザー ロール、およびユーザーの個人設定の格納と取得には、データベースを使用していました。開発者は、これらの情報を実装するのに相当の時間を費やしていましたが、Visual Web Developer 2005 Express Edition では、ASP.NET に組み込まれた一連のユーザー テーブルを提供してこれらすべての情報を格納することにより、はるかに簡単にこれらの情報を処理できるようにしました。

プロバイダをセットアップするには、[Provider] タブをクリックして画面上部の [Provider Configuration] リンクをクリックします。次に、[Select a single provider for all site management data] リンクをクリックします。さまざまなプロバイダを管理する画面が表示されます。既定では、AspNetAccessProviderAspNetSqlProvider という 2 つのプロバイダがセットアップされています。先ほど説明したように、Access が既定のプロバイダなので、最初にこの画面が表示されたときには AspNetAccessProvider が選択されています。SQL Server 2005 Express Edition を使用して "StudentActivities" データベースにアクセスするので、新しいプロバイダを追加する必要があります。追加するには、[Add a new provider] リンクをクリックします。

プロバイダ情報を指定できる画面が表示されます。画面の左側には、SQL Server DatabaseAccess Database の 2 つのオプションが表示されます。[SQL Server Database] を選択してください。次に、SQL Server 接続情報を指定します。[Server name] ボックスに、「(local)\SQLExpress」と入力します。SQL Server Express は、ローカルにインストールする軽量なファイルベースのデータベースとしてデザインされています。インストール時には、"SQLExpress" という SQL Server Express インスタンスが作成されます。アプリケーションの開発で使用するのはこのインスタンスです。[Friendly name] ボックスに、「SQL Express Provider」と入力します。[Database name] ボックスに、追加した .MDF ファイルへの物理パス (「c:\Websites\StudentActivities\Data\StudentActivities.mdf」) を入力します。このパスが不明な場合は Visual Web Developer 2005 Express Edition のデータ エクスプローラに移動して、作成したデータ接続を表示できます。データ接続を、"<コンピュータ名>\SQLExpress:<MDF ファイル パス>" にする必要があります。この MDF ファイル パスを [Database name] ボックスに入力します。次に、認証情報を指定します。認証情報は、.MDF データベースのセットアップで使用したログイン情報と一致させる必要があります。[Save] をクリックします。

   SQL Server Express のセキュアな方法によるインストールに関する詳細については、「SQL Server 2005 Express Edition サーバーをセキュリティで保護する」の「SQL Server Express Edition のインストール」を参照してください。

図 3. Web サイト管理ツールによるメンバシップ プロバイダのセットアップ

ストレージと特定のメンバシップ情報の取得に関する多数のオプションが表示されます。これらのオプションを簡単に見ていきましょう。最初のオプションでは、一意の電子メールのみを格納できるかどうかを管理者が決定できます。このチェック ボックスがオンになっていると、複数のアカウントで重複する電子メール アドレスを格納することができなくなります。次のオプションでは、ユーザーがパスワードを忘れてしまった場合にそのパスワードを取得できるかどうかを管理者が決定できます。このチェック ボックスがオンになっている場合、ユーザーにパスワードを送信できます。次のオプションでは、ユーザーは、新しいパスワードをランダムに生成し電子メールで送信してもらうことを要求できます。最後のオプションでは、ユーザーは、パスワードが送信される前に質問に正しく回答する必要があります。ASP.NET 2.0 により、これらのオプションに付随するすべての機能が提供されます。つまり、開発者はセキュリティ関連の機能をコードを使用して実装する必要がないのです。

今回のデモ アプリケーションの目的から、[Required unique e-mail] チェック ボックス、[Allow password retrieval] チェック ボックス、[Require question and answer] チェック ボックスをオンにし、[Save password in secure format] チェック ボックスをオフにします。次に、[Save] をクリックします。

次に表示される画面では、サイト カウンタとページ カウンタの設定を制御できます。これらのカウンタでは、ユーザーが特定のリンクをクリックした回数や特定のページを参照した回数が記録されます。管理者は、サイト カウンタがメモリからデータベースに保存される頻度を調節することによってアプリケーションのパフォーマンスを最適化できます。さらに管理者は、データを書き出してエラーをイベント ログに記録する間のサイト カウンタ サービスの待機時間を指定できます。

このアプリケーションの目的から、既定の設定のまま [Save] をクリックします。

次の画面では、Cookie ドメインをセットアップして、ロール マネージャの Cookie がブラウザによって送信されるタイミングを決定できます。フォーム認証とロール マネージャの両方をアプリケーションで使用している場合は、どちらの機能も Cookie ドメインを同じ値に設定する必要があります。

すぐに Cookie を使用しないので、既定値のまま [Save] をクリックします。

プロバイダが正常にセットアップされたというメッセージが表示されます。このセットアップにより一連の SQL スクリプトが実行されて、いくつかのセキュリティ関連のテーブルとストアド プロシージャが生成されました。生成されたこれらのテーブルとストアド プロシージャはメンバシップ サービスによって使用され、ユーザー アカウント、ロール、およびユーザー資格情報が管理されます (Visual Web Developer 2005 Express Edition から SQL Server Express に接続する方法を説明するので、この資料の後半でこれらの新しいテーブルについて参照してください)。最後に、web.config ファイルでは、いくつかのプロバイダ固有の要素に加えてプロバイダへの接続文字列が更新されます。以下に、web.config ファイルに追加されたプロバイダ部分の例を示します。

<providers>
<add connectionStringName="SSE_Connection"
applicationName="/StudentActivities" requiresUniqueEmail="true"
   enablePasswordRetrieval="true" enablePasswordReset="false" 
requiresQuestionAndAnswer="true"     
passwordFormat="Hashed" name="SSE_ACtivities" 
type="System.Web.Security.SqlMembershipProvider, System.Web, 
Version=2.0.3500.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxx"/>
</providers>

[OK] をクリックして Web サイト管理ツールのプロバイダ セクションに戻ります。プロバイダの一覧にプロバイダが追加されオプション ボタンが選択されています。

ロール マネージャによるロールのセットアップ

次に行うのは、アプリケーションのユーザー ロールのセットアップです。今回のアプリケーションでは、"Administrator" と "Student" という 2 つの基本的なロールを使用します。Web サイト管理ツールで、[Security] タブをクリックします。このタブの表には、3 つの列があります。1 つはユーザー用、1 つはロール用、もう 1 つはアクセス規則用です。

図 4. Web サイト管理ツールの [Security] タブの図

行を有効にするには、[Roles] 列で [Enable roles] をクリックします。新しいロールを作成するには、[Create roles] リンクをクリックします。これにより、ロール名を入力するシンプルな画面が表示されます。テキスト ボックスに「Administrator」と入力して [Add Role] をクリックします。ロールが作成されると、アプリケーションで使用可能なロールの一覧に、作成されたロールが表示されます。これらの手順を "Student" ロールについても繰り返して、"Student" ロールをアプリケーションに追加します。この一連の手順により、これらのロールが StudentActivities データベースの aspnet_Roles テーブルに追加されました。

ユーザー アカウントのセットアップ

ここで、何人かのユーザーをアプリケーションに追加します。学生の追加はアプリケーション自体を使用して行うのですが、何をする必要があるのかを示すために、Web サイト管理ツールを使用して学生を 1 人追加します。まず、[Users] 列で [Create User] リンクをクリックします。クリックするとフォームが表示されます。このフォームで新しいユーザーを作成し、作成したユーザーにロールを割り当てることができます。学生を追加する前に、まず "Administrator" ロールに割り当てられているユーザー アカウントを追加しましょう。"admin1" というダミーのアカウントを作成します。ユーザー名、パスワード、確認用のパスワード、一意の電子メール アドレス、およびセキュリティ上の質問と回答を入力します。セキュリティ上の質問と回答は、ユーザーのパスワードを回復する際に質問と回答を要求するプロバイダ オプションに関連付けられます。このオプションを選択しなかった場合は、これらのフィールドは使用できなくなっています。このユーザーを "Administrator" ロールに割り当てるには、[Roles] 列の [Administrator] チェック ボックスをオンにします。

画面の下には 3 つのチェック ボックスもあります。[Send Password] チェック ボックスは、完了時にパスワードが自動的に電子メールで新しいアカウントに送信されるオプションです。[Autogenerate Password] チェック ボックスは、新しく作成されたログイン ユーザー アカウントのパスワードが自動的に生成されるオプションです。このオプションを選択すると、パスワードが自動的に生成され、電子メールでユーザーに送信されます。

[Active User] チェック ボックスは、ユーザー アカウントをアクティブなユーザーとして認識するためのオプションです。このアプリケーションの背景から、学生のアカウントの有効期限は一般に 4 年以下になります。管理者は、卒業時や休学時に、学生の資格情報を削除するのではなくこのチェック ボックスをオフにすることにより、その学生を無効にすることができます。アカウントは残りますが、無効にされたユーザーはアプリケーションにログインできなくなります。後になって、その学生が進学や休学期間の終了などの理由から復学した場合には、このチェック ボックスをオンにすることにより、管理者はそのユーザーを再度有効にできます。その学生用に新しいアカウントを作成する必要がありません。

図 5. Web サイト管理ツールでの新しいユーザー アカウントの作成

ユーザーに関する情報をすべて入力し終えたら、[Create User] をクリックします。このユーザーの保存時に、新しい行が "StudentActivities" データベースの aspnet_Users テーブルに保存されます。さらに、新しい行が aspnet_UsersInRoles テーブルに挿入されます。このような流れでユーザーのロール情報が格納されます。ここで、"Administrator" ロールが 1 つ作成されたので、同様の手順を使用して "student1" という名前の "Student" ユーザーを 1 つ作成します。もちろん、[Roles] 列の [Student] チェック ボックスをオンにして "Student" のロールに割り当てます。

ここまでの手順で、プロバイダを SQL Server Express データベースに追加し、2 つのアプリケーション ロール ("Administrator" および "Student") を作成しました。また、2 つのアプリケーション ユーザー ("admin1" および "student1") を作成しました。次は、作成したテーブルを表示できるように、Visual Web Developer 2005 Express Edition で SQL Server Express への接続をセットアップしましょう。まずは、web.config ファイルを少しだけ変更してフォーム認証をセットアップします。

web.config ファイルでのフォーム認証のセットアップ

フォームベースの認証は、アクセスするのに特権が必要なアプリケーション リソースに特定のユーザーがアクセスできるかどうかを、そのユーザーのログイン基準に基づいて決定するためのフォームを使用するプロセスです。フォームベース認証の設計では、ユーザー名、パスワード、関連付けられているロールなど、ユーザーを特定する情報を収集するために使用するログイン フォームを、開発者が作成します。有効なユーザー名とパスワードをユーザーが指定すると、そのユーザーはアクセス許可が与えられているすべてのフォームにアクセスできるようになります。アクセスが承認されていないページにアクセスしようとすると、ログイン画面に戻ります。

フォーム認証を実装するには、[StudentActivities] ディレクトリのルートフォルダにある web.config ファイルを開きます。Web フォームで、既定の <authorization> タグと <authentication> タグを以下のコードで置き換えます。

<authorization>
<deny users="?" />
</authorization>       
<authentication mode="Forms">
<forms loginUrl="~/ContentPages/login.aspx" />
</authentication>
        

<authorization> タグの下位には、<deny users="?" /> 要素があります。この要素は、原則としてどの匿名ユーザー (ログインしていないユーザー) もこの特権フォルダへのアクセスを拒否されることを示しています。<authentication mode="Forms"> タグは、フォーム認証を実装していることを意味します。<forms loginUrl="~/ContentPages/login.aspx"/> タグは、サイト内の保護された場所へ匿名ユーザーがアクセスしようとすると、サーバーによってログイン画面 "~/ContentPages/login.aspx" へとリダイレクトされることを示します。ログイン プロセスを経由せずにアクセスしようとするユーザーは、そのユーザー自身の資格情報が確認されるまでログイン画面に戻されます。

データ エクスプローラの内部でのデータ接続のセットアップ

SQL Server Express が持つ、MSDE 2000 よりも優れた点の 1 つはデータベース管理に使用しやすい GUI をサポートしている点です。この資料の作成時点ではこのインターフェイスはまだ実装されていません。したがって、Visual Web Developer 2005 Express Edition のデータ エクスプローラを使用してデータベースの参照と管理を行います。

データ エクスプローラを Visual Web Developer 2005 Express Edition で開くには、[View] メニューの [Data Explorer] をクリックします。[Data Connections] ルートの下にデータベース [StudentActivities] がツリー ビュー形式で表示されます。データベースのツリー ビューを展開していくと、[Tables] という名前のフォルダが表示されます。このフォルダの中に、メンバシップ プロバイダをセットアップしたときに生成されたすべてのテーブルが表示されます。テーブルが表示されない場合は、データ接続を強調表示して [Refresh] をクリックし、ビューを更新します。テーブルの内容を表示するには、aspnet_Users を右クリックして [Show Table Data] をクリックします。"admin1" と "student1" の両方で使用されるレコードが表示されます。最後に、次の手順に移る前に [StudentActivities] データベース の [Stored Procedures] フォルダの中を見ておきましょう。プロバイダがセットアップされたときに生成された多数のストアド プロシージャが表示されます。たとえば、"aspnet_Membership_CreateUser" ストアド プロシージャは、新しいログイン ユーザー アカウントを作成するために使用します。"aspnet_UsersInRoles_AddUsersToRoles" ストアド プロシージャはユーザーをロールに追加するために使用します。残念なことに、あまりにも多くのストアド プロシージャがあるためにこの資料で取り上げることはできませんが、それらのストアド プロシージャを調査して、開発時にコストをほとんどかけずに使用できる機能を知っておくことをお勧めします。

これらのストアド プロシージャは、ユーザー資格情報、個人設定、およびアプリケーション設定を管理するためにメンバシップ サービスによってアクセスされます。この資料では、SQL Server Express の内部動作の詳細については扱いません。SQL Server Express でテーブルとストアド プロシージャを手動で作成する方法の詳細については、このシリーズの次の資料を参照してください。次の資料では主に SQL Server 2005 Express Edition を説明しています。

すべての環境をセットアップしたので、アプリケーションのビルドを開始できます。

セキュリティ サーバー コントロール

この資料はセキュリティに注目しているので、主にセキュリティ サーバー コントロールについて取り上げます。Visual Web Developer 2005 Express Edition では、自動的にメンバシップ サービスと統合される数多くの便利なサーバー コントロールが開発者に提供されます。以下に、主要なセキュリティ サーバー コントロールとそれぞれの簡単な説明を示します。

  • Login - メンバシップ プロバイダに対してユーザーの資格情報を認証します。
  • LoginView - ログインしたユーザーに関連付けられたロールに基づき、さまざまな出力を表示します。
  • LoginStatus - ユーザーが適切にログインしているかどうかを表示します。
  • CreateUserWizard - ログイン アカウントをユーザーが作成できるようにします。
  • PasswordRecovery - 忘れたパスワードをユーザーが簡単に回復できるようにします。
  • ChangePassword - ユーザーがユーザー自身のパスワードを変更できるようにします。

これらの各サーバー コントロールがメンバシップ プロバイダに統合されてユーザーの資格情報の認証と承認が行われます。その際、認証や承認のためのコードは不要です。学生の履修科目登録用 Web サイトの一連の画面を使用しながら各コントロールを説明します。

Login コントロール、LoginStatus コントロール、および LoginView コントロール

このシリーズでは、学生の履修状況 Web サイトの各ページを順にビルドします。

このアプリケーションのビルドにあたり、まず、BaseForm.master というマスタ ページを追加します。マスタ ページは、ASP.NET 2.0 によって提供される新しいテンプレートドリブン アーキテクチャにおいて基礎となるテンプレートです (今後公開するこのシリーズの 3 つ目の資料でマスタ ページの詳細を説明します)。ソリューション エクスプローラでマスタ ページを作成するには、[MasterPages] フォルダを右クリックして [Add New Item] をクリックし、[Master Page] をクリックします。ファイル名を BaseForm.master に変更して、[OK] をクリックします。

Visual Web Developer 2005 Express Edition の既定の設定によって異なりますが、新しいマスタ ページが追加されると、コーディング ペインに BaseForm.master のソース コードが表示されるか、デザイン ビューにマスタ ページが表示されます。ソース コードが表示される場合は、このマスタ ページをデザイン ビューで表示するために、コーディング ペインで [Design] をクリックします。

フォーム上に ContentPlaceHolder コントロールのインスタンスが表示されます。このコントロールの名前を "cphMain" に変更します。3 つ目の資料ではこのマスタ ページに戻り、マスタ ページの目的を詳細に説明するとともに、見た目を整え機能性を追加します。ただし、ここではセキュリティ上の問題のみを取り上げましょう。

BaseForm.master では、LoginLoginStatus、および LoginView という、セキュリティに関わる 3 種類のサーバー コントロールを使用します。

まず、LoginStatus コントロールをメイン フォームにドロップして "lsLogin" という名前を付けます (このコントロールはツールボックスの [Login] タブの下にあります)。このコントロールの LogoutAction プロパティを "Redirect" に、LogoutPageUrl プロパティを "~/ContentPages/Logout.aspx" に設定し、LoginText プロパティには何も設定しません。LoginStatus コントロールは、アプリケーションのログイン状態と関連付けられているナビゲーション コントロールです。したがって、Web ユーザーが匿名 (ユーザーがログインしていないことを意味します) の場合は、LoginText 値が表示されます。今回の場合、この値には何も設定せず、匿名ユーザーの場合にはリンクを表示しないようにします。ユーザーがログインしている場合は、LogoutText が表示されます。ユーザーが Logout リンクをクリックした場合は、LogoutPageUrl プロパティで定義されている URL のページが表示されます。

次に、登録済みのユーザーがこの Web サイトにログインする方法を追加する必要があります。まず、LoginView コントロールをドラッグ アンド ドロップして "lvMain" という名前を付けます (このコントロールはツールボックスの [Login] タブの下にあります)。LoginView コントロールは、ユーザーのログイン状態によって異なる出力を表示するために使用します。LoginView コントロールを右クリックし、表示されたショートカット メニューで [Edit Template] をクリックします。次に、[AnonymousTemplate] をクリックします。AnonymousTemplate 内に格納されているコントロールはすべて、そのページを表示しているユーザーが認証されていない (ログインしていない) 場合に常に表示されます。反対に、LoggedInTemplate のコンテンツは、認証されたユーザーがそのページを表示した場合に表示されます。さらに、ロールを LoginView に割り当てることによって LoggedInTemplate を詳細に定義できます。これにより、該当するロールでログインしているユーザーに対してのみコンテンツが表示されるようになります。シリーズの 3 つ目の資料では、この機能を使用します。ここでは、AnonymousTemplate を開いて Login コントロールをテンプレートにドラッグ アンド ドロップします。

図 6. Login コントロール、LoginView コントロール、および LoginStatus コントロールを備えた BaseForm を表示するデザイン ビュー

Login コントロールでは、既定のメンバシップ プロバイダに対してユーザーの資格情報を認証します。開発者側で行うことは何もありません。ASP.NET により自動的にユーザーの資格情報がチェックされ、パスワードとユーザー名に基づき認証されます。Login コントロールは AnonymousTemplate に格納されているので、認証されていないユーザーのみに Login コントロールが表示されます。ユーザーがログインするとユーザーのログイン状態が変化するので LoginView コントロールの出力がその影響を受けます。

CreateUserWizard コントロール

次に、管理者が新しい学生を作成できる画面を作成します。ASP.NET 2.0 には CreateUserWizard コントロールが導入されています。このコントロールは新しいログイン ユーザーを追加するためにメンバシップ サービスに統合されているサーバー コントロールです。このコントロールを使用するのは簡単です。フォームにこのコントロールをドロップする以外はほとんどすることがありません。

このコントロールを配置するための新しいコンテンツ ページを追加して、"LoginCreateUser.aspx" という名前を付けます。コンテンツ ページは派生形式になっており、ASP.NET 2.0 によって提供される新しいテンプレートドリブン アーキテクチャのマスタ ページに合わせて作成されます (今後公開するこのシリーズの 3 つ目の資料でコンテンツ ページの詳細を説明します)。次に、CreateUserWizard コントロールのインスタンスをドロップして "cuwUser" という名前に変更し、ContinueDestinationPageUrl プロパティを "~/ContentPages/Activity.aspx" に設定します。これらが、このページをメンバシップ サービスに統合するために必要なすべてです。Web ユーザーが必要なユーザー情報をこのコントロールに対して指定すると、新しいユーザーが aspnet_Users テーブルに生成されます。

図 7. CreateUserWizard コントロールのデザイン ビュー

このアプリケーションでは、管理者が新しいユーザーを "Student" ロールに追加できます。このコントロールに制限事項が 1 つあるとすれば、ユーザー ロールを読み取って新しいログイン ユーザーにそのユーザー ロールを割り当てるための組み込みの機能が存在しないことです。幸いにも、ASP.NET 2.0 ではユーザーを "Student" ロールに非常に簡単に追加することができる簡単な Roles API を開発者に提供しています。

"cuwUser" コントロールを "LoginCreateUser.aspx" のデザイン ビューでダブルクリックします。これにより、Visual Web Developer Express によって "cuwUser_CreatedUser" という空のイベント コード スタブがイベント ハンドラと共に CodeBehind ファイルに生成されます。このイベントは、ユーザーが有効なログイン資格情報を指定して新しいユーザーを作成した後、Create User をクリックすると発生します。イベント プロシージャの中に、次のコード行を記述します。

      Roles.AddUserToRole(cuwUser.UserName, "Student")

コードのこの行は、Roles API の AddUserToRole() メソッドの呼び出しを行います。このメソッドにはユーザー名とロール名の 2 つのパラメータが必要です。学生だけがアプリケーションから追加されるので、cuwUser の UserName プロパティからユーザー名にアクセスして、ハードコードされている文字列 "Student" を使用してロール パラメータに渡すことができます。この文字列 "Student" は大文字と小文字が区別されないことに注意する必要があります。文字列 "Student" をハードコードするのではなく、このページを簡単に拡張して管理者がロールを選択できるようにすることも可能です。そのためには、aspnet_Roles テーブルにバインドされたデータ ソース コントロールと、そのデータ ソース コントロールにバインドされた他のコントロール (コンボ ボックスなど) を追加する必要があります。その場合、このコードはハードコードされた文字列 "Student" の代わりに、コンボ ボックスで選択されている値が AddUserToRole() メソッドに渡される、というように変更されます。

PasswordRecovery コントロール

Web ユーザーがパスワードを忘れるのはよくあることです。開発者にとって幸いなことに、ASP.NET 2.0 にはこの状況に対処するための PasswordRecovery というコントロールもあります。このコントロールはメンバシップ サービスに統合されており、忘れたパスワードがユーザーの電子メール アカウントに電子メールで送信されます。当然のことですが、回復したパスワードをユーザーに電子メールで送信するためのプロバイダを管理者がセットアップした場合にこの機能が有効になります。

図 8. PasswordRecovery コントロールのデザイン ビュー

このコントロールが機能しているところを見るために、新しいコンテンツ ページを追加して "LoginPasswordRecovery.aspx" という名前を付けましょう。次に、PasswordRecovery コントロールをページにドロップして "prUser" という名前に変更し、SuccessPageURL プロパティを "~/ContentPages/Login.aspx" に設定します。また、MailDefinition:From プロパティに、電子メールの送信元となるドメインの電子メール アドレスを入力します。ここでは、架空のアカウントである admin@studentrec.com を使用していますが、これを管理者の電子メール アカウントに置き換える必要があります。簡単な例では、ユーザーがこのページを参照して有効なユーザー名を入力した場合に、ユーザーのパスワードがそのユーザーに電子メールで送信されます。ユーザーが不適切なユーザー名を入力すると、PasswordRecovery コントロールの UserNameFailureText プロパティで定義されているエラーが表示されます。

セキュリティ機能を追加してメンバシップ プロバイダをセットアップしている場合は、ユーザー アカウントに関連付けられたセキュリティ上の質問に最初に回答することをユーザーに要求するプロパティを設定したことを思い出してください。そのため、ユーザーが有効なユーザー名を入力すると、そのユーザーは自分のユーザー アカウントに関連付けられたセキュリティ上の質問に回答するように求められます。ユーザーが質問に正しく回答するとパスワードが電子メールでそのユーザーに送信され、SuccessPageURL プロパティで定義されている URL にリダイレクトされます。そのユーザーが間違った回答をすると、パスワードの要求が拒否され、PasswordRecovery コントロールの QuestionFailureText プロパティで定義されているエラーが表示されます。

ChangePassword コントロール

この資料で取り上げている最後のコントロールは ChangePassword コントロールです。このコントロールでは、ログインしたユーザーが自分のパスワードを変更できます。

図 9. ChangePassword コントロールのデザイン ビュー

ここでは、新しいコンテンツ ページを追加して LoginChangePassword.aspx という名前を付けます。フォームに ChangePassword コントロールをドロップして "cpUser" という名前に変更します。これにより、既存のパスワードと新しいパスワードの入力、および新しいパスワードの確認のための入力をユーザーに求める UI が実装されます。

ユーザーが正しい現在のパスワードの入力に失敗した場合は、パスワードを変更する要求が受け取られず、ChangePasswordFailureText プロパティで定義されているエラーが表示されます。パスワードが正しく、新しいパスワードが有効で、かつ、確認用のパスワードも適切な場合は、メンバシップ サービスによってユーザーのアカウントが新しいパスワードに更新されます。

まとめ

メンバシップ サービスによる ASP.NET 2.0 の導入は、セキュアな Web アプリケーションを適切に作成するという開発者の責務を劇的に軽減します。強力な Web サイト管理ツール、SQL Server 2005 Express Edition テクニカル プレビュー、およびユーザーの資格情報と認証を管理する一連のセキュリティ サーバー コントロールの統合により、ほとんどコードを使用しないか、まったくコードを使用しないセキュリティベースのソリューションが開発者に提供されます。

第 2 部では、SQL Server Express のしくみをさらに詳しく説明し、データ コンポーネントを備えたデータ アクセス層を作成します。その後、ObjectDataSource を使って、データ コンポーネントとプレゼンテーション層のサーバー コントロールを結び付けます。


Dan Burman は、ニューヨークを拠点とするカスタム ソフトウェア会社 Citigate Hudson のコンサルタントです。Citigate Hudson は、Microsoft Gold Certified Partner for Business Intelligence です。Citigate HudsonLeave-ms の Web サイトを参照してください。


この情報は役に立ちましたか。
(残り 1500 文字)