最終更新日 2005 年 11 月 14 日

このコンテンツのポイント

  • Forms 認証について理解する。
  • Login コントロールやコードによる認証の実装方法について理解する。
  • 承認についての基礎事項を理解する。

今回紹介するコード

<Login.aspx.vb>

Visual Basic
Protected Sub Button1_Click(ByVal sender As Object, _
                            ByVal e As System.EventArgs) Handles Button1.Click
    '有効なユーザーか確認する
    If System.Web.Security.Membership.ValidateUser( _
            TextBox1.Text, TextBox2.Text) Then
        '有効なユーザーならリダイレクトする
        System.Web.Security.FormsAuthentication.RedirectFromLoginPage( _
            TextBox1.Text, False)
    Else
        Label1.Text = "ログインに失敗しました。"
    End If
End Sub
 

<Web.config>

<authentication mode="Forms">
        <forms loginUrl="Login.aspx"
               defaultUrl="Default.aspx" />
    <authentication/>
 
    <authorization>
        <deny users="?"/>
    <authorization/>

 

今回のシステム要件

  • Visual Studio 2005 Beta 2

目次

はじめに
作成するアプリケーションの概要
Web フォームのデザイン
ログイン ページのデザイン
ユーザー認証のコードの記述
Web.config ファイルの設定
ユーザーの作成
動作と解説
おわりに

C# の内容はこちらに掲載しています。
10 行でズバリ!! Web アプリケーションにおける認証と承認 (C#)

 


はじめに

ASP.NET Web アプリケーションでは、様々な認証方法や承認方法が提供されています。ここでは、ログイン ページを用いた認証方法である Forms 認証について、その基本的な実装方法を扱います。

ASP.NET には、Forms 認証を実装するためのクラス ライブラリや、簡単に Forms 認証を実現する Web サーバー コントロールが用意されています。それらのいつくかを用いて、基本的な Forms 認証の実装方法について取り上げます。

なお、Web アプリケーションの基本的な開発方法についての説明は割愛します。基本的な開発方法については 「10 行でズバリ !! ASP.NET Web フォームによる Web アプリケーション開発 (VB)」をご覧ください。

作成するアプリケーションの概要

今回のサンプル アプリケーションでは、2 つの Web フォームを使用します。

一つ目は、実際にユーザーが Web ブラウザから URLを指定してアクセスするWeb フォームです。

二つ目は、未認証のユーザーがユーザー名とパスワードを入力するログイン ページの Web フォームです。

また、 ASP.NET の構成ファイルである Web.config ファイルについても、Forms 認証が機能するように構成します。さらに、ASP.NET 固有の管理ツールである Web サイト管理ツールを使って、ログイン用のユーザー アカウントを作成します。

Web フォームのデザイン

まず、新規にWebサイトを作成します。Visual Studio 2005 の [ファイル] メニューをクリックし、[新規作成] をポイントして、[Web サイト]をクリックします。 すると、[新しい Web サイト] ダイアログボックスが表示されます。

ここでは、言語として Visual Basic を選択し、テンプレートとして 「ASP.NET Web サイト」 を選択します。 [場所] 欄では、ドロップダウン リストで 「ファイル システム」が選択されていることを確認した後、任意のパスを指定して (たとえば、 「C:\Test\WebAuthVB」 など)を入力し(図 1)、[OK] をクリックします。

図 1. Web サイトを新規に作成する

これで、雛形となる Web サイトができました。

既定の構成では、Default.aspx の編集画面としてソース ビューが開いているので、編集画面の左下部にある [デザイン] タブをクリックして、Web ページのデザイン画面に切り替えます。このデザイン画面で、画面レイアウトが図2になるように、まず、テキスト文字列を直接入力します。さらに、ツール ボックスの[ログイン] タブから、 LoginName コントロール一つを、ドラッグ アンド ドロップして貼り付けます(「ユーザー名」と表示された部分)。

なお、ツールボックスの [ログイン] タブには、ユーザーの認証に関わる様々なコントロールが用意されています。これらを使用すると、ログインに関わるコーディング量が減少し、効率よく実装することができます。

図 2. 一つ目のWeb フォームをデザインする

ログイン ページのデザイン

次に、ログイン ページの Web フォームを作成するために、ソリューション エクスプローラのツリー上の、Web サイトのノード (今回の例では C:\Test\WebAuthVB) を右クリックして、[新しい項目の追加] メニューをクリックします。[新しい項目の追加] ダイアログボックスが表示されるので、テンプレートとして [Web フォーム] を選択し、[名前] ボックスには「Login.aspx」 と入力します。他は既定のままにして、[追加] ボタンをクリックします。

Login.aspx のソース ビューが表示されるので、編集画面の左下にある [デザイン] タブをクリックして、デザイン ビューに切り替えます。

まず、ツールボックスの [ログイン] タブから、ログイン用のユーザー インターフェイスを持つ Login コントロールをドラッグ アンド ドロップします。すると、Login コントロールが貼り付くと同時に、スマート タグが表示されます。(図 3) ここで、スマート タグの [オート フォーマット] メニューをクリックします。

図 3. ログイン ページに Login コントロールを追加する

すると、[オート フォーマット] ダイアログ ボックスが表示されるので(図4)、左ペインのスキームの一覧から、「プロフェッショナル」をクリックして選択し、[OK] をクリックします。これを利用すると、Login コントロールに対して、本格的なスタイルを簡単に設定することができます。

図 4. Login コントロールのフォーマットを指定する

これを利用すると、Login コントロールに対して、本格的なスタイルを簡単に設定することができます。デザイン画面には、スタイルが設定された Login コントロールが表示されます。(図 5)

図 5. フォーマットが整形されたLogin コントロールが表示される

このコントロールは、表示されたとおり、ログインで使用するユーザー インターフェイスを一つにまとめた部品です。これを使用すれば、わざわざ、ログイン画面の各構成要素を一つ一つ作る必要はありません。また、この Login コントロールには、ビジュアルなユーザー インターフェイスだけでなく、ログインで必要な認証のロジックも実装されています。わざわざ、コードを記述する必要はありません。つまり、ログイン ページは、これで完成なのです。

本来であれば、これで十分です。しかし、ここではコーディング レベルでのログインの実装方法も確認するので、あえて、この画面に、手作りのログイン用ユーザー インターフェイスも追加します。図6 のように、TextBoxを二つ、Button を一つ、そして、Label を一つ追加してください。

Button の Text プロパティは 「ログイン」に変更し、Label の Text プロパティは空にします。

また、二つ目の TextBox はパスワード入力用なので、この TextBox の TextMode プロパティを、既定の「SingleLine」 から 「Password」 に変更してください。

図 6. 独自のログイン用ユーザー インターフェイスも追加する

ユーザー認証のコードの記述

先に触れたように、Login コントロールを使用すれば、わざわざログイン用のコードを書く必要はありません。Login コントロールにも、ユーザー インターフェイスをカスタマイズしたり、イベント ハンドラを利用してカスタム ロジックを割り込ませたりすることができ、かなりの応用範囲があるので、ゼロから手作りのログイン画面を作る必要はあまりないでしょう。しかし、ここではログイン認証の基本的な仕組みを理解することも目的なので、あえてコードを使った実装も取り上げます。

Login.aspx のデザイン画面で、[ログイン] ボタンをダブルクリックして、Button1_Click イベント ハンドラを生成させ、以下のコードを記述します。

Visual Basic
Protected Sub Button1_Click(ByVal sender As Object, _
                            ByVal e As System.EventArgs) Handles Button1.Click
    '有効なユーザーか確認する
    If System.Web.Security.Membership.ValidateUser( _
            TextBox1.Text, TextBox2.Text) Then
        '有効なユーザーならリダイレクトする
        System.Web.Security.FormsAuthentication.RedirectFromLoginPage( _
            TextBox1.Text, False)
    Else
        Label1.Text = "ログインに失敗しました。"
    End If
End Sub
 

Forms 認証では、利用者が未認証の状態で URL を指定してサイトにアクセスしようとしたとき、ログイン用の画面にリダイレクトされます。このコードは、そのログイン画面の例です。[ログイン] ボタンを押すと、このイベント ハンドラが実行されます。

この例では、System.Web.Security 名前空間に属する MemberShip クラスと FormsAuthentication クラスの二つのクラスを使用しています。

まず、このイベント ハンドラでは、ユーザー名とパスワードを引数として、MemberShip クラスの ValidateUser メソッドを呼び出して、有効なユーザーか検証しています。このメソッドを呼び出すと、既定の構成では、Web サイト上の App_Data フォルダにある ASPNETDB.MDF (SQL Server Express のデータ ベース) に保存されたユーザー情報をチェックします。わざわざ、データ ベースにアクセスするコードを記述する必要はありません。また、アクセス先のデータ ストアは、構成ファイルで変更することも可能です。いずれにしても、プログラマがユーザーの検証のために書くコードは1行だけです。

ユーザーが有効であることが確認できた場合、if ブロックの内部が実行されます。ここでは、FormsAuthentication クラスの RedirectFromLoginPageメソッドを呼び出しています。この呼び出しによって、ユーザーは認証されたことになり、認証済みのユーザー情報がクッキーに格納されます。さらに、未認証ユーザーが本来アクセスを試みた URL へ、再度リダイレクトされ、本来のページが表示されます。このメソッドの 1番目の引数はユーザー名、2番目の引数はクッキー内の認証情報を永続性あるものにするか指定するものです。つまり、ブラウザを閉じた後も、認証情報を残すかどうか指定するものです。この例では、false が指定されているので、ユーザーはブラウザを閉じると、認証が無効になります。

なお、既定では認証情報はクッキーに格納されますが、構成ファイルで変更することもできます。

Web.config ファイルの設定

Forms 認証を有効にするには、 Web構成ファイルである Web.config 内で指定する必要があります。Web.config ファイルは、メニュー操作から雛形を追加できるほか、Visual Studio のいくつかのウィザードは、必要に応じて Web.config ファイルを生成したり、既存の Web.config ファイルを修正したりできます。ここでは、新規に追加します。

ソリューション エクスプローラのツリー上の、Web サイトのノード (今回の例では C:\Test\WebAuthVB) を右クリックして、[新しい項目の追加] メニューをクリックします。[新しい項目の追加] ダイアログボックスが表示されるので、テンプレートとして [Web 構成ファイル] を選択し、[名前] ボックスでは「Web.config」 という既定のファイル名のままにします。 ほかは既定のままにして、[追加] ボタンをクリックします。

これによって、Web サイトに Web.config ファイルが追加され、Web.config ファイルのテキスト エディタが開きます。

ここで、Web.config ファイルを書き換えます。既存の <authentication> 要素を見つけ、以下のように書き換えます。さらに、<authentication> 要素の下に、 要素を追加します。

<authentication mode="Forms">
        <forms loginUrl="Login.aspx"
               defaultUrl="Default.aspx" />
    <authentication/>
 
    <authorization>
        <deny users="?"/>
    <authorization/>

 <authentication> 要素の mode 属性では、認証方法を指定しています。ここでは、Forms 認証を使用するので、「Forms」を指定します。

この <authentication> 要素内の子要素である <forms> では、Forms 認証の細かい指定ができます。loginUrl 属性は、未認証ユーザーのリダイレクト先であるログイン ページを指定します。

また、ログイン ページで認証を受けた場合、ユーザーが最初にアクセスを試みた URL へ再度リダイレクトされるのですが、はじめからユーザーがログイン ページの URL を指定していた場合、認証後のリダイレクト先がありません。その場合の既定のリダイレクト先が、defaultUrl 属性です。ここでは、Default.aspx に指定しておきました。

なお、loginUrl 属性と defaultUrl 属性の既定値が、そもそも、ここに示した構成ファイルの値なので、<forms>子要素は書かなくとも、同じ結果になります。

これ以外に、<authorization> 要素があります。この部分は、承認 (アクセス制御) を指定する部分で、ユーザーごとに特定のフォルダにアクセスできるかどうかなど、細かいアクセス制御を行うことができます。ここで指定するユーザーには、認証を受けたユーザーのほか、未認証のユーザー (匿名ユーザーとも呼ばれる) も指定できます。実は、Forms 認証を使って、未認証ユーザーに対してログイン ページへリダイレクトさせるには、<authorization> 要素で、未認証ユーザーのアクセスを禁止するよう指定する必要があるのです。この例の「<deny users="?" />」は、未認証ユーザーのアクセスを禁止するもので、「?」は未認証ユーザーを表す表記方法です。

ここでは、<authorization> 要素の詳しい書き方は省略しますが、これを利用すると、特定のフォルダやページだけ、未認証ユーザーのアクセスを禁止することもできるので、結果的に、特定の一部の URL だけ認証を要求するよう構成することもできるのです。

ユーザーの作成

次にユーザーの作成です。Forms 認証のユーザー作成は、クラス ライブラリを用いてコードで作成できるほか、CreateUserWizard コントロールというユーザー作成を行うユーザー インターフェイスを使って作成することもできます。また、ASP.NET 固有の Web サイト管理ツールから作成することも可能です。ここでは、Web サイト管理ツールを使います。

ソリューション エクスプローラ上で Web サイト ノード (この例では C:\Test\WebAuthVB) をクリックして選択した状態にします。メニューバーの [Web サイト] メニューをクリックし、[ASP.NET 構成] メニューをクリックします。すると、この Web サイトを管理する Web サイト管理ツールが起動します。(図7)

図 7. Web サイト管理ツール

ASP.NET では、Web サイト上の特定のアドレスにアクセスすると、このようなWebベースの管理ツールが起動できます。

ここで、[セキュリティ] リンクをクリックします。セキュリティ構成のページに切り替わります。

図 8. セキュリティ構成を行うことができる

ここで、[ユーザーの作成] リンクをクリックします。すると、ユーザーの作成画面が表示されます。(図 9)

図 9. ユーザーを作成できる

ここで、ユーザー情報として以下の項目を入力します。

  • ユーザー名: taro
  • パスワード、およびパスワードの確認: Pa$$word!
  • 電子メール: taro@abcde.com
  • セキュリティの質問、およびセキュリティの返答: (任意)

[ユーザーの作成] ボタンを押して、ユーザーを作成します。作成が完了したら、ページ上の [ホーム] タブをクリックして初期ページに戻ります。正常にユーザーが作成されていた場合、「既存のユーザー」の数が「1」に変化しているはずです。(図10)

図 10. ユーザーが作成された

なお、既定の構成では、この操作によって、App_Data フォルダの下に ASPNETDB.MDF ファイルが作成されています。ソリューション エクスプローラで Web サイトをクリックして選択した後、ソリューション エクスプローラ上部の [最新の情報に更新] ボタン (左から2番目) をクリックすると、Web サイト内にデータベース ファイルが追加されていることが分ります。

図 11. データベース ファイルが追加された

動作と解説

コードも画面も完成しましたので、実行してみます。まず、ソリューション エクスプローラ上で、Default.aspx を1回クリックして、選択された状態にします。次に、[Ctrl+F5] キーを押すか、[デバッグ] メニューの [デバッグなしで開始] をクリックします。すると、Visual Studio 2005 の既定の構成では、試験用の Web サーバーとして 「ASP.NET 開発サーバー」が自動的に起動し、そのサーバーの上で、Web アプリケーションが実行されるようになります。

今回は、URL としてDefault.aspx を指定していますが、未認証ユーザーの状態なので、ログイン ページにリダイレクトされます。URL欄には、クエリ文字列として 「?ReturnUrl=~」の部分には、認証後の再リダイレクト先が指定されています。ここで、この画面上部の Login コントロールにユーザー情報を入力します。(図 12)

図 12. ログイン ページが表示される

認証に成功すると、URL に本来指定していたDefault.aspx に再度リダイレクトされます。このページには、LoginName コントロールが含まれていたので、ログインしたユーザー名も表示されています。(図13)

図 13. 認証後、本来のページに再度リダイレクトされる

ここで、ブラウザを閉じます。

ソリューション エクスプローラ上で、Default.aspx を選択した状態にして、[Ctrl+F5] キーを押すか、[デバッグ] メニューの [デバッグなしで開始] をクリックして、再び実行します。

ログイン ページが表示されるので、今度は、下半分の手作りのログイン画面から、ログインを行います。(図 14)

図 14. 再びログインを行う

問題なくログインが行われ、図 13 の状態になるはずです。

このほか、無効ユーザーでログインした場合はどうなるかなど、色々試して、動作を確認してみてください。

おわりに

このように、ASP.NET には認証のための様々な実装方法が用意されています。ログイン関連のコントロールを使用すれば、コードを書かずして Forms 認証を実装することができます。また、きめ細かい制御を行えるように、様々なクラス ライブラリが用意されています。

ログイン関連のコントロールやクラス ライブラリには、これ以外にも、多種多様な機能が提供されています。特に Visual Studio のツールボックスの [ログイン] タブには、ログイン機能をカプセル化した様々なコントロールが用意されています。試しにドラッグ アンド ドロップして、どのような機能があるか確認するとよいでしょう。


Code Recipe .NET Framework デベロッパー センター

ページのトップへ