.NET TIPS

[ASP.NET]フォーム認証のユーザー管理をデータベース・サーバで行うには?

山田 祥寛
2004/04/16

 別稿「TIPS:[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?」では、カスタムのユーザー管理用XML文書を追加することで、web.configでは扱うことができない独自のユーザー属性を自由に拡張する方法について紹介した。

 しかし、ユーザー管理の媒体がXMLデータであることに抵抗を感じる方は意外と少なくないはずだ。XMLはいまやデータ記述言語として確実にデファクト・スタンダードの地位を確立しつつあるとはいえ、まだまだ誕生して間がない技術でもある。XML文書の取り扱いにハードルを感じるプログラマは決して少なくはないし、また、読み込みだけならばいざ知らず、登録・更新の処理までもアプリケーションから行おうとした場合、サーバへの負荷や同時アクセスによる競合の管理までも意識しなければならないのは、プログラマにとって明らかな負担である。

 ユーザー情報を不特定多数のユーザーに自由に更新させたいようなケースでは、ユーザー情報をXMLファイルとしてではなく、データベース・サーバで管理する方がかえって簡便でもある。

 データベース・サーバを利用するということは、単純にコーディングを簡略化するというだけではない。別稿「TIPS:[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?」では、いったんXML文書をすべてメモリ上に読み込まなければならなかったため、管理すべきユーザー数が増大した場合、サーバのリソース消費は無視できないものとなるが、データベース・サーバを利用した場合にはこれを意識する必要がない。また、XMLファイルでは、いかにパスワードが暗号化されているとしても、ほかのユーザー属性が任意の第三者に読み取られてしまう危険性を否定できない。例えば、ファイル・システムに対して直接にアクセスできるユーザーなどの場合は読み取りが可能だろう。しかし、データベース・サーバではデータベース独自の認証機能を持つため、単なるファイルよりもはるかに高い安全性が期待できる。

 そこで本稿では、別稿「TIPS:[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?」のサンプルをデータベース・サーバに置き換えてみることにしたい。別稿との違いを比較しつつ、ご覧いただきたい。

1. ユーザー管理用のテーブルを定義する

 データベース上に以下のようなユーザー管理用の「usrテーブル」を定義してみよう。テーブル内には、ユーザーIDとパスワードのほか、任意のユーザー属性を含むことができる。

フィールド名 データ型 概要
uid VARCHAR(50) ユーザーID(主キー)
passwd VARCHAR(50) パスワード(SHA1方式で暗号化)
unam VARCHAR(20) ユーザー名(未使用)
depart VARCHAR(20) 所属部門(未使用)
role VARCHAR(50) カンマ区切りの役割名(未使用)
usrテーブルのフィールド・レイアウト

 また、usrテーブルには仮に以下のようなデータが含まれているものとしよう。パスワードはあらかじめSHA1方式で暗号化したものを記述している。暗号化の方法については、別稿「TIPS:[ASP.NET]フォーム認証用のパスワードを暗号化するには?」を参照いただきたい。

uid passwd unam depart role
yyamada 8CB2237D0679CA88DB6464EAC60DA96345513964 山田祥寛 営業第2課 admin, super,usr
nkakeya 8CB2237D0679CA88DB6464EAC60DA96345513964 掛谷奈美 システム企画部 super, usr
kusui 8CB2237D0679CA88DB6464EAC60DA96345513964 薄井浩一 人事部 usr
usrテーブル内にあらかじめ格納されているサンプル・データ

2. web.configの設定を行う

 ユーザー情報をテーブル化してしまったので、web.configにはもはや<credentials>要素配下の情報は必要ない。別稿「TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?」のweb.configから<credentials>要素を取り除いておこう。また、<forms>要素のloginUrl属性(ログイン・ページの指定)を「db_login_cs.aspx」に変更する。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms name="Insider.NET" loginUrl="db_login_cs.aspx"
        protection="All" timeout="30" />
    </authentication>
  </system.web>
</configuration>
<credentials>要素を取り除いた構成ファイル(web.config)

 なお、認証対象のフォルダ(例えば、「/auth」フォルダ)におけるweb.configについては、別稿「TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?」のものをそのまま転用することができる。

3. ログイン・ページを設計する

 ユーザー管理にデータベース・サーバを利用する場合には、ログイン・ページには若干のコードの追加が必要になる。というのも、認証の可否を判定するためのFormsAuthenticationクラス(System.Web.Security名前空間)のAuthenticateメソッドがデータベース・サーバに対しては利用できないためだ。よって、認証を判定する部分のロジックについては、自ら構築する必要がある。次のサンプル・プログラムは、この処理を行っているログイン・ページの実装例である。

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
void objBtn_Click(Object sender, EventArgs e) {
  // 入力されたユーザーID、パスワードでusrテーブル内のレコードを検索
  SqlConnection objDb=new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=nettips");
  SqlCommand objCom=new SqlCommand("SELECT * FROM usr WHERE uid=@uid AND passwd=@passwd",objDb);
  objCom.Parameters.Add("@uid",txtUsr.Text);
  objCom.Parameters.Add("@passwd",FormsAuthentication.HashPasswordForStoringInConfigFile(txtPass.Text,"SHA1"));
  objDb.Open();
  SqlDataReader objDr=objCom.ExecuteReader();
  if(objDr.Read()){
    // 検索の結果、該当するレコードが存在した場合、認証は成功
    FormsAuthentication.RedirectFromLoginPage(txtUsr.Text,false);
  }else{
    objLbl.Text="正しいユーザーID、パスワードを入力してください";
  }
  objDb.Close();
}
</script>
<html>
<head>
<title>フォーム認証ログイン</title>
</head>
<body>
<form runat="Server">
<center>
<h1>フォーム認証ログイン</h1>
<hr />
<b>ユーザーID:</b>
<asp:TextBox id="txtUsr" runat="Server" Columns="12" /><br />
<b>パスワード:</b>
<asp:TextBox id="txtPass" runat="Server" Columns="11" TextMode="Password" />
<br />
<asp:Button id="objBtn" runat="Server" Text="ログイン" OnClick="objBtn_Click" /><br />
<asp:Label id="objLbl" runat="Server" ForeColor="Red" />
</center>
</form>
</body>
</html>
認証ロジックを組み込んだC#のログイン・ページ(db_login_cs.aspx)
 
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
Sub objBtn_Click(sender As Object, e As EventArgs)
  ' 入力されたユーザーID、パスワードでusrテーブル内のレコードを検索
  Dim objDb As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=nettips")
  Dim objCom As New SqlCommand("SELECT * FROM usr WHERE uid=@uid AND passwd=@passwd",objDb)
  objCom.Parameters.Add("@uid",txtUsr.Text)
  objCom.Parameters.Add("@passwd",FormsAuthentication.HashPasswordForStoringInConfigFile(txtPass.Text,"SHA1"))
  objDb.Open()
  Dim objDr As SqlDataReader=objCom.ExecuteReader()
  If objDr.Read() Then
    ' 検索の結果、該当するレコードが存在した場合、認証は成功
    FormsAuthentication.RedirectFromLoginPage(txtUsr.Text,False)
  Else
    objLbl.Text="正しいユーザーID、パスワードを入力してください"
  End If
  objDb.Close()
End Sub
</script>
<html>
<head>
<title>フォーム認証ログイン</title>
</head>
<body>
<form runat="Server">
<center>
<h1>フォーム認証ログイン</h1>
<hr />
<b>ユーザーID:</b>
<asp:TextBox id="txtUsr" runat="Server" Columns="12" /><br />
<b>パスワード:</b>
<asp:TextBox id="txtPass" runat="Server" Columns="11" TextMode="Password" />
<br />
<asp:Button id="objBtn" runat="Server" Text="ログイン" OnClick="objBtn_Click" /><br />
<asp:Label id="objLbl" runat="Server" ForeColor="Red" />
</center>
</form>
</body>
</html>
認証ロジックを組み込んだVB.NETのログイン・ページ(db_login_vb.aspx)

 FormsAuthenticationクラスのAuthenticateメソッドを使用する限りにおいてパスワードが暗号化されているかどうかということは気にする必要がない。しかし、ここで1つだけ注意すべき点は、本稿のようにカスタムの認証ロジックを自ら組み込んだ場合には、暗号化の処理も自ら組み込まなければならないという点である。

 以上で一連の準備は完成だ。「/auth」フォルダ配下の任意のファイルにアクセスし、別稿「TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?」同様、フォーム認証が正常に動作することを確認してみてほしい。

 なお、認証後の任意のページにおいては、任意のユーザー属性情報を引用することが可能である。詳細については、別稿「TIPS:[ASP.NET]認証後のページでカスタムのユーザー情報を引用するには?」を参照いただきたい。End of Article

カテゴリ:Webフォーム 処理対象:認証
使用ライブラリ:FormsAuthenticationクラス(System.Web.Security名前空間)
関連TIPS:[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?
関連TIPS:[ASP.NET]フォーム認証用のパスワードを暗号化するには?
関連TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?
関連TIPS:[ASP.NET]認証後のページでカスタムのユーザー情報を引用するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?
[ASP.NET]認証後のページでカスタムのユーザー情報を引用するには?
[ASP.NET]構成ファイルのみでフォーム認証を実現するには?
[ASP.NET AJAX]クライアントサイド・スクリプトからカスタムの認証機能を利用するには?
[ASP.NET]セキュリティ・コントロールでログイン機能を作成するには?
[ASP.NET]フォーム認証用のパスワードを暗号化するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間