Share via


第 2 章 「ユーザー情報の管理 ~ Profile ~(前半)」~ Commerce Server 2002 で学ぶ ASP.NET ~

NRI ラーニングネットワーク株式会社
溝端 二三雄

2003 年 1 月 22 日

目次

2-1 ASP.NET フォーム 認証 2-1 ASP.NET フォーム 認証
   2-1-1 フォーム認証とは2-1-1 フォーム認証とは
   2-1-2 フォーム認証の基本的な実装2-1-2 フォーム認証の基本的な実装
   2-1-3 ログインページの実装 2-1-3 ログインページの実装

2-1 ASP.NET フォーム 認証

Commerce Server が独自の認証システムを提供しているのは、より柔軟かつ高度な認証システムを容易にシステムに実装することができるようにするためです。今回は ASP.NET で Web アプリケーションを作成するので、ASP.NET フォーム認証を使用することが可能です。ASP.NET では IIS の認証を使用することも可能ですが、クライアントのブラウザ、OS を特定できないインターネットアプリケーションの場合、独自のユーザー認証を実装することが一般的です。その際、フォーム認証を使用すると驚くほど簡単にユーザー認証が必要な Web サイトを構築できます。

2-1-1 フォーム認証とは

図 2 がフォーム認証をまとめたものです。青色で示した部分は開発を必要とする部分です。ただし、「(6) はじめに要求したページにリダイレクト」に関しては .NET Framework を使用すれば、たった 1 行のコードで実現できます。つまり、データベースにアクセスしユーザー名とパスワードが正しいことを確認するコードを開発するだけでユーザー認証の仕組みが完成します。

図

2 フォーム認証の概要

2-1-2 フォーム認証の基本的な実装

フォーム認証を実装するためにはまず、Web アプリケーションの構成を行います。Fabrikam サンプル Web サイトの構成ファイル、/Fabrikam/Web.Config を確認してください。<configuration> 要素内の <system.web> 要素に以下の設定がされています。

<authentication mode="Forms" > 
        <forms loginUrl="login.aspx" />
</authentication>

これにより、この Web アプリケーションはフォーム認証を使用することになります。また、ログインページは login.aspx(省略時の既定値と同じ)を指定しています。これでフォーム認証の設定はできましたが、これだけでは十分ではありません。ASP.NET の承認の設定が必要です。承認とは特定のユーザー、グループに対してアクセスを許可、拒否する設定です。この構成は /Fabrikam/Contents/Web.Config で以下のように行われています。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <authorization>
        <deny users="?" /> 
    </authorization>
  </system.web>
</configuration>

"?" は匿名ユーザー (未認証のユーザー) をあらわします。<deny> 要素に定義されていることから、「匿名ユーザーのアクセスは拒否する」という設定になります。つまり、この構成ファイルが適用されるASP.NETのページ (今回は /Fabrikam/Contents) は ASP.NET により認証 (今回はフォーム認証) されたユーザーのみに制限されます。ここまでの設定で、図 2 の (2) (3) (11) が自動的に実行されるようになります。

2-1-3 ログインページの実装

ログインページでは図 2 の (5) (7) (8) を実装します。サンプルの login.aspx ページの [ログイン] ボタンのクリックイベントプロシージャを確認します。

Private Sub cmdLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLogin.Click
        If MyAuth(txtUserName.Text, txtPassword.Text) Then
            FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, False)
        End If

        lblError.Text = "ログイン認証に失敗しました。ユーザー名とパスワードを確認して再度実行してください。"

    End Sub

MyAuth メソッドに入力されたユーザー名とパスワードを渡し、False が返ってくるとラベルにログイン失敗のエラーが表示されます。MyAuth メソッドが True を返した場合 (ユーザー名とパスワードが正しい場合) 実行されるのが FormAuthentication クラスの RedierectFromLoginPage メソッドです。このクラスは System.Web.Security 名前空間にあります。

RedirectFromLoginPage は以下の作業を全て行います。

  • 第 1 引数で渡されたユーザー名としてサーバー上のセキュリティコンテキストが作成されます。

  • ユーザーがもともと要求していたページ (ASP.NET がクエリ文字列として保存している) にリダイレクトします。

  • リダイレクトの際にセキュリティコンテキストに関連付けられた Cookie を暗号化してクライアントに送信します。

つまり、このメソッド 1 つで図 2 の (7) (8) が ASP.NET により実行されるのです。第2引数はクライアントに送信した Cookie を永続化するかどうかを指定する Boolean 型の引数です。

後は (5) の独自のユーザー認証 (MyAuth メソッド) の実装です。ユーザー情報にアクセスするには Profile クラスのインスタンス(以降は Profile オブジェクトと表現します)を使用します。つまり、Profile オブジェクトのプロパティにパスワード情報も存在するわけです。

Private Function MyAuth(ByVal strUserName As String, ByVal strPassword As String) As Boolean
        Dim ctxProfile As New ProfileContext()
        Dim myProfile As Profile = ctxProfile.GetProfile(strUserName)
        If myProfile.Properties.Count = 0 Then
            Return False
        End If

        Dim strSavedPassword As String = myProfile.Properties.Item("UserSecurityPassword").Value
        If strSavedPassword = strPassword Then
            Return True
        Else
            Return False
        End If
    End Function

この Profile オブジェクトはどのようになっているのでしょう。図 1 Fabrikam サイトの全体像を見ていただくとデータベースに UserObject というテーブルが存在するのがわかります。このテーブルがユーザー情報を格納しているテーブルです。つまり、Profileオブジェクトはこの UserObject テーブルから作成されます。この部分はコラムの本題ともいえるデータベースプログラミングの解説となりますが Microsoft Commerce Server 2002 はこの部分をオブジェクト指向言語の特徴をうまく生かして再利用性の高いクラス設計を行っています。これらの解説は次の連載 (第 2 章後半) で行います。

第 2 章 (後半) では Profile 関連のクラス設計の解説と ADO.NET DataReader の解説を行います。

CS2000.jpg

  二三雄: 東京を中心に .NET Framework ならびに .NET Enterprise Servers のトレーニングを開発、実施している。その多忙な業務の中、日々夜の街に吸い込まれ、そこでも大活躍しているようだが、実は大阪在住で2児の父親でもある。できるだけ多くの技術者のお役に立てる技術を伝達することに喜びを感じているので、トレーナーという職業はまさに天職である。