フォーム認証でユーザーを認証する (C#)
提供元: Microsoft
[Authorize] 属性を使用して、MVC アプリケーション内の特定のページをパスワードで保護する方法について説明します。 Web サイト管理ツールを使用して、ユーザーとロールを作成および管理する方法について説明します。 また、ユーザー アカウントとロールの情報を保存する場所を構成する方法についても説明します。
このチュートリアルの目的は、フォーム認証を使用して、ASP.NET MVC アプリケーションのビューをパスワードで保護する方法について説明することです。 Web サイト管理ツールを使用してユーザーとロールを作成する方法について説明します。 また、承認されていないユーザーがコントローラー アクションを呼び出すのを防ぐ方法についても説明します。 最後に、ユーザー名とパスワードを保存する場所を構成する方法について説明します。
Web サイト管理ツールの使用
他の作業を行う前に、まず一部のユーザーとロールを作成する必要があります。 新しいユーザーとロールを作成する最も簡単な方法は、Visual Studio 2008 Web サイト管理ツールを利用することです。 このツールは、メニュー オプションで [プロジェクト]、[ASP.NET]、[構成]を選択して起動できます。 または、ソリューション エクスプローラー ウィンドウの上部に表示される、ハンマーが世界を叩こうとしている (やや怖い) アイコンをクリックして、Web サイト管理ツールを起動することもできます (図 1 を参照)。
図 1 - Web サイト管理ツールの起動
Web サイト管理ツール内で、[セキュリティ] タブを選択して、新しいユーザーとロールを作成します。[ユーザーの作成] リンクをクリックして、Stephen という名前の新しいユーザーを作成します (図 2 を参照)。 必要なパスワード (シークレットなど) を Stephen ユーザーに提供します。
図 2 – 新しいユーザーの作成
新しいロールを作成するには、最初にロールを有効にし、1 つ以上のロールを定義します。 [ロールの有効化] リンクをクリックしてロールを有効にします。 次に、[ロールの作成または管理] リンクをクリックして、Administrators という名前のロールを作成します (図 3 を参照)。
図 3 – 新しいロールの作成
最後に、Sally という名前の新しいユーザーを作成し、[ユーザーの作成] リンクをクリックし、Sally の作成時に [管理者] を選択して、Sally を管理者ロールに関連付けます (図 4 を参照)。
図 4 – ロールへのユーザーの追加
すべてが完了したら、Stephen と Sally という名前の 2 人の新しいユーザーができているはずです。 Administrators という名前の新しいロールもあるはずです。 Sally は管理者ロールのメンバーですが、Stephen はそうではありません。
承認の要求
アクションに [Authorize] 属性を追加することで、ユーザーがコントローラー アクションを呼び出す前にユーザーの認証を要求できます。 [Authorize] 属性は、個々のコントローラー アクションに適用することも、コントローラー クラス全体に適用することもできます。
たとえば、リスト 1 のコントローラーは CompanySecrets() という名前のアクションを公開します。 このアクションは [Authorize] 属性で修飾されているため、ユーザーが認証されない限り、このアクションを呼び出すことはできません。
リスト 1 – Controllers\HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[Authorize]
public ActionResult CompanySecrets()
{
return View();
}
}
}
ブラウザーのアドレス バーに URL /Home/CompanySecrets を入力して CompanySecrets() アクションを呼び出すと、認証されたユーザーでない場合は、Login ビューにリダイレクトされます (図 5 を参照)。
図 5 – Login ビュー
Login ビューを使用して、ユーザー名とパスワードを入力できます。 登録済みユーザーでない場合は、[登録] リンクをクリックして [登録] ビューに移動できます (図 6 を参照)。 Register ビューを使用して、新しいユーザー アカウントを作成できます。
図 6 – Register ビュー
正常にログインすると、CompanySecrets ビューが表示されます (図 7 を参照)。 既定では、ブラウザー ウィンドウを閉じるまでログインした状態が続きます。
図 7 – CompanySecrets ビュー
ユーザー名またはユーザー ロールによる承認
[Authorize] 属性を使用すると、コントローラー アクションへのアクセスを特定のユーザー セットまたは特定のユーザー ロールのセットに制限できます。 たとえば、リスト 2 の変更されたホーム コントローラーには、StephenSecrets() と AdministratorSecrets() という名前の 2 つの新しいアクションが含まれています。
リスト 2 – Controllers\HomeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[Authorize]
public ActionResult CompanySecrets()
{
return View();
}
[Authorize(Users="Stephen")]
public ActionResult StephenSecrets()
{
return View();
}
[Authorize(Roles = "Administrators")]
public ActionResult AdministratorSecrets()
{
return View();
}
}
}
ユーザー名が Stephen のユーザーのみが、StephenSecrets() アクションを呼び出すことができます。 他のすべてのユーザーは Login ビューにリダイレクトされます。 Users プロパティは、ユーザー アカウント名のコンマ区切りのリストを受け入れます。
AdministratorSecrets() アクションを呼び出すことができるのは、Administrators ロールのユーザーだけです。 たとえば、Sally は Administrators グループのメンバーであるため、AdministratorSecrets() アクションを呼び出すことができます。 他のすべてのユーザーは Login ビューにリダイレクトされます。 Roles プロパティは、ロール名のコンマ区切りのリストを受け入れます。
認証を構成する
この時点で、ユーザー アカウントとロールの情報がどこに保存されているか疑問に思うかもしれません。 既定では、情報は MVC アプリケーションの App_Data フォルダーにある ASPNETDB.mdf という名前の (RANU) SQL Express データベースに保存されます。 このデータベースは、メンバーシップの使用を開始すると、ASP.NET フレームワークによって自動的に生成されます。
ソリューション エクスプローラー ウィンドウでASPNETDB.mdf データベースを表示するには、まずメニュー オプション [プロジェクト] の [すべてのファイルを表示] を選択する必要があります。
アプリケーションを開発するときは、既定の SQL Express データベースを使用しても問題ありません。 ただし、ほとんどの場合、実稼働アプリケーションには既定のASPNETDB.mdf データベースを使用したくはありません。 その場合は、次の 2 つの手順を実行して、ユーザー アカウント情報の保存場所を変更できます。
- Application Services データベース オブジェクトを実稼働データベースに追加する - 運用データベースを指すアプリケーション接続文字列を変更します
最初の手順は、必要なすべてのデータベース オブジェクト (テーブルとストアド プロシージャ) を運用データベースに追加します。 これらのオブジェクトを新しいデータベースに追加する最も簡単な方法は、ASP.NET SQL Server セットアップ ウィザードを利用することです (図 8 を参照)。 このツールを起動するには、Microsoft Visual Studio 2008 プログラム グループから Visual Studio 2008 コマンド プロンプトを開き、コマンド プロンプトから次のコマンドを実行します。
aspnet_regsql
図 8 – ASP.NET SQL Server セットアップ ウィザード
ASP.NET SQL Server セットアップ ウィザードを使用すると、ネットワーク上の SQL Server データベースを選択し、ASP.NET アプリケーション サービスに必要なすべてのデータベース オブジェクトをインストールできます。 データベース サーバーは、ローカル コンピューターに配置する必要はありません。
Note
ASP.NET SQL Server セットアップ ウィザードを使用しない場合は、次のフォルダーにアプリケーション サービス データベース オブジェクトを追加するための SQL スクリプトがあります。
C:\Windows\Microsoft.NET\Framework\v2.0.50727
必要なデータベース オブジェクトを作成したら、MVC アプリケーションで使用されるデータベース接続を変更する必要があります。 Web 構成 (web.config) ファイル内の ApplicationServices 接続文字列を変更して、運用データベースを指すようにします。 たとえば、リスト 3 の変更された接続は、MyProductionDB という名前のデータベースを指しています (元の ApplicationServices 接続文字列はコメント アウトされています)。
リスト 3 – Web.config
<connectionStrings>
<!--<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>-->
<add name="ApplicationServices" connectionString="data source=localhost;Integrated Security=SSPI;Initial Catalog=MyProductionDB" />
</connectionStrings>
データベース権限の構成
統合セキュリティを使用してデータベースに接続する場合は、正しい Windows ユーザー アカウントをデータベースへのログインとして追加する必要があります。 正しいアカウントは、ASP.NET 開発サーバーとインターネット インフォメーション サービスのどちらを Web サーバーとして使用しているかによって異なります。 正しいユーザー アカウントは、オペレーティング システムによっても異なります。
ASP.NET 開発サーバー (Visual Studio で使用される既定の Web サーバー) を使用している場合、アプリケーションは Windows ユーザー アカウントのコンテキスト内で実行されます。 その場合は、データベース サーバー ログインとして Windows ユーザー アカウントを追加する必要があります。
または、インターネット インフォメーション サービスを使用している場合は、ASPNET アカウントまたは NT AUTHORITY/NETWORK SERVICE アカウントをデータベース サーバー ログインとして追加する必要があります。 Windows XP を使用している場合は、ASPNET アカウントをログインとしてデータベースに追加します。 Windows Vista や Windows Server 2008 などのより新しいオペレーティング システムを使用している場合は、NT AUTHORITY/NETWORK SERVICE アカウントをデータベース ログインとして追加します。
Microsoft SQL Server Management Studio を使用して、新しいユーザー アカウントをデータベースに追加できます (図 9 を参照)。
図 9 - 新しい Microsoft SQL Server ログインの作成
必要なログインを作成したら、適切なデータベース ロールを持つデータベース ユーザーにログインをマップする必要があります。 ログインをダブルクリックし、[ユーザー マッピング] タブを選択します。1 つ以上のアプリケーション サービス データベース ロールを選択します。 たとえば、ユーザーを認証するには、aspnet_Membership_BasicAccess データベース ロールを有効にする必要があります。 新しいユーザーを作成するには、aspnet_Membership_FullAccess データベース ロールを有効にする必要があります (図 10 を参照)。
図 10 – Application Services データベース ロールの追加
まとめ
このチュートリアルでは、ASP.NET MVC アプリケーションをビルドするときにフォーム認証を使用する方法について説明しました。 まず、Web サイト管理ツールを利用して新しいユーザーとロールを作成する方法について説明しました。 次に、[Authorize] 属性を使用して、承認されていないユーザーがコントローラー アクションを呼び出さないようにする方法について説明しました。 最後に、運用データベースにユーザーとロールの情報を保存するように MVC アプリケーションを構成する方法について説明しました。