連載

プログラミングASP.NET
― ASP.NETによるWebアプリケーション実践開発講座 ―

第19回 フォーム認証を実装したASP.NETアプリケーション

田口 景介
2003/07/26
Page1 Page2

Back Issue
1
ASP.NETがもたらす次世代のWebプログラミング
2
ASP.NETの基礎 サーバ・コントロール編
3
ASP.NETの基礎 イベント編
4
ASP.NETページのフレームワーク(前編)
5
ASP.NETページのフレームワーク(後編)
6
Webサーバ・コントロール(前編)
7
Webサーバ・コントロール(中編)
8
Webサーバ・コントロール(後編)
9
Webフォームにおけるデータ連結 Part1 データ連結とは
10
Webフォームにおけるデータ連結 Part2 DataListコントロール
11
Webフォームにおけるデータ連結 Part3 DataGridコントロール
12
Webフォームにおけるデータ連結 Part4 DataGridでの編集
13
スタイル(前編)
14 スタイル(後編)
15 セッションとビューステート
16 ASP.NETにおけるページの遷移
17 ASP.NETにおける認証と認定
18 Windows認証を実装したWebアプリケーション


フォーム認証

 前回では、Windows認証を実装したWebアプリケーションである「winauth」を作成しながら、そのプログラムについて解説した。今回はwinauthアプリケーションとまったく同じ機能のアプリケーションを、フォーム認証を使って実装していくことにしよう。アプリケーションの名前は「formauth」と名付けることにする。

 formauthアプリケーションは以下に示す4つのファイルから構成されている。

  • web.config
  • login.aspx(ログイン・フォーム)
  • default.aspx(認証されたユーザーに関する情報を表示する)
  • admin.aspx(adminに所属するユーザーだけがアクセスできる)

formauthアプリケーションのダウンロード(formauth.zip)

 アプリケーション実行時のそれぞれの画面は以下のようなものだ。

 このうちdefault.aspxとadmin.aspxは前回のwinauthアプリケーションとほぼ同じものを使用しているので(ただしdefault.aspxには[サインアウト]ボタンが追加されている)、以降の解説は設定ファイルであるweb.configと、ログイン・フォームであるlogin.aspxを中心に進める。

 
図19.1 login.aspx
認証のためにユーザー名とパスワードを入力させるログイン・フォーム
 
図19.2 default.aspx
認証されたユーザーに関する情報を表示する
 
図19.3 admin.aspx
このページはadminに所属するユーザーだけがアクセスできる。

■web.configでの設定

 まずはweb.configから見ていこう(リスト19.1)。authentication要素で認証モード(Forms)を指定し、authorization要素でURL認定のルールが指定されているところはWindows認証と同じだが、フォーム認証にまつわるパラメータを設定するforms要素と、資格情報を記述するcredentials要素が追加されている。

<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms name="formauth" loginUrl="login.aspx"
        protection="All" path="/" timeout="30">
        <credentials passwordFormat="Clear">
          <user name="user1" password="hoge" />
          <user name="user2" password="himitsu" />
        </credentials>
      </forms>
    </authentication>
    <authorization>
      <deny users="?" />
    </authorization>
  </system.web>
</configuration>
リスト19.1 フォーム認証のweb.config

 forms要素の属性値として指定されるフォーム認証のパラメータは、ログイン・フォームへのURLを示すloginUrl属性を除いて、すべて認証チケットとなるクッキーのために使われるものである(表19.1)。

 フォーム認証では、いったん認証されると認証チケットと呼ばれる資格情報がクッキーとしてクライアントへ送信される。クライアントはこのクッキーを送信することで認証済みであることを示し、アプリケーションへアクセスすることができる。もし認証チケットを示さずにアクセスを試みれば、どのページへアクセスしようとしても、loginUrl属性で指定されたページへとリダイレクトされることになる。

属性 目的
name アプリケーション名。認証チケットを保存するクッキーの名前に使われる
loginUrl ログイン・フォームのURL
protection クッキーの暗号化と検証の有無を指定
timeout チケットの有効期間(単位:分)
path クッキーのパス
表19.1 forms要素の属性

 form要素中にあるcredentials要素の子要素には、以下のようにして、ログイン・フォームでの認証に使われる資格情報を記述できる。ここではcredentials要素のpasswordFormat属性に“Clear”を指定しているので、パスワードを平文で指定しているが、“MD5”または“SHA1”を指定することで、ハッシュ値を指定することも可能だ。ただし、ハッシュ値を求めるツールなどは用意されていないので、必要ならば自作しなければならない。

  <user name="ユーザー名" password="パスワード" />

 こうしてフォーム認証用の資格情報をweb.configに記録しておけば、別途パスワードファイルを用意する必要がなくなり、フレームワークから提供されるヘルパ・メソッドを利用して認証を行えるため非常に手軽だ。しかし、この方法ではユーザーが所属するロールを記録できないなどデメリットが少なくない。そこで、これは簡易的な認証手段と割り切り、実際には資格情報の管理を独自に実装すべきだろう。これについて詳しくは後述するformauth2アプリケーションで解説する。

■ログイン・フォーム

 認証チケットを持たないユーザーがリダイレクトされてくるログイン・フォームのページがリスト19.2に示すlogin.aspxである。

<%@ Page Language="C#" %>
<html>
<head>
<script runat="server">
void login_Click(object sender, EventArgs e) {
  if (FormsAuthentication.Authenticate(tbUsername.Text, tbPassword.Text)) {
    FormsAuthentication.RedirectFromLoginPage(tbUsername.Text,
      persist.Checked);
  } else {
    Message.Text = "失敗しました。パスワードを確認してください";
  }
}

</script>
</head>
<body>
  <form runat="server">
    <p>UserName : <asp:TextBox id="tbUsername" runat="server" /></p>
    <p>Password : <asp:TextBox id="tbPassword" TextMode="Password" runat="server" /></p>
    <p>
      <asp:CheckBox id="persist"
        Text="認証情報を記憶する" runat="server"/>
      <asp:Button id="login" Text="ログイン"
        OnClick="login_Click" runat="server" />
    </p>
    <p><asp:Label id="Message" ForeColor="red" runat="server" /></p>
  </form>
</body>
</html>
リスト19.2 ログイン・フォームとなるlogin.aspx

 恐らく予想よりもかなり単純に思えるはずだ。ログイン・フォームでは、入力されたユーザー名とパスワードから認証を行い、成功したら認証チケットを発行して、元々アクセスされていたページへとリダイレクトする作業を行う。この作業は、以下のように2つのメソッドを呼び出すだけで実装できる。

  if (FormsAuthentication.Authenticate(tbUsername.Text, tbPassword.Text)) {
    FormsAuthentication.RedirectFromLoginPage(tbUsername.Text,
      persist.Checked);
  }

 Authenticateメソッドは指定された資格情報をweb.configに登録された情報を使って認証し、成功すればtrue、失敗すればfalseを戻す。一方、RedirectFromLoginPageメソッドは、web.configに指定されたパラメータに従って認証チケット(クッキー)を発行し、クエリー文字列のReturnUrlキー(ログイン・フォームへ導かれる前のURLを値に持つ)へリダイレクトするメソッドである。これらのヘルパ・メソッドは、いずれもSystem.Web.Security名前空間に宣言されているFormsAuthenticationクラスのメソッドとして実装されている。

 RedirectFromLoginPageメソッドの第2パラメータにfalseを指定したとき、認証チケットはセッション・クッキーとして作成されるため、セッションを終了すると消えてしまうが、trueを指定してパーマネント・クッキーとして作成することもできる。この場合、50年という非常に長い有効期限を持つクッキーがクライアントのディスク上に作成されるため、ブラウザをいったん終了しても、ログイン・フォームへリダイレクトされることなく再びアプリケーションへとアクセスできるようになる。サンプルformauthでは、ログイン・フォームで[認証情報を記憶する」チェック・ボックスがチェックされていればパーマネント・クッキーが作成されるようにしてある。

 パーマネント・クッキーを利用すれば、資格情報の入力をスキップできるので便利ではあるが、このままでは別の資格情報(別のユーザー)でログインできなくなってしまうので、default.aspxにはクッキーを削除するための[サインアウト]ボタンを追加している。このボタンをクリックすると、以下のコードによってクッキーが削除され、ログイン・フォームへとリダイレクトされる。

void signout_Click(object sender, EventArgs e) {
  FormsAuthentication.SignOut();
  Response.Redirect("login.aspx");
}


 INDEX
  プログラミングASP.NET
  第19回 フォーム認証を実装したASP.NETアプリケーション
  1.フォーム認証を実装したサンプル・アプリケーション
    2.カスタム認証とロールベースの認定を用いたフォーム認証
 
インデックス・ページヘ  「連載 :プログラミングASP.NET」

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • Kinectが切り開く“夢の近未来” (2012/2/2)
     日本を含めた世界中でKinect for Windowsセンサー商用版とSDK正式版がリリース。未来のコンピューティングはどう変化するのか?
  • 3つの視点でネイティブと.NETの適材適所を考察 (2012/1/31)
     アプリ開発は「ネイティブ」と「.NET」、どちらが最良? その問いには「適材適所」と答えるしかない。では、“適所”は一体どこかを考察する
  • SQL Azure Data Sync入門 (2012/1/30)
     SQL Azure/SQL Serverデータベース間のデータ同期を簡単に実現するサービスとは? その仕組みや使用手順を解説
  • Windows Phoneアプリ市場の現状を分析する (2012/1/27)
     Windows Phone のアプリ・ストアに日々登録されている多種多様なアプリ。カテゴリ別のアプリ数は? 市場の現状を明らかにする

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH