.NET TIPS

[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?

山田 祥寛
2004/04/09

 別稿「TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?」では、web.configのみを利用したフォーム認証の実現方法について紹介した。ログイン・ページの作成において、ごくごく定型的なコーディングが必要であるほかは、ほとんどプログラムレスで認証の仕組みを構築できることがお分かりいただけたことと思う。

 しかし、実際のアプリケーションを構築するに際しては、不満に思われる方も少なくないはずだ。というのも、web.configにおいてはユーザー名とパスワードしか管理することができないが、多くのアプリケーションにおいては認証ユーザーに関するさまざまな情報をともに管理したいというケースが少なくないからだ。ユーザー名、ユーザーの所属部門、E-Mailアドレス……、あるいはパーソナライゼ―ション機能を持つアプリケーションならば、画面の初期設定に関するさまざまな情報を保持したいということもあるだろう。純粋に、リソースへのアクセス制限を目的とした認証でない限り、ユーザー情報と称するものの中には多くの付随情報を含むのが通常である。

 そこで本稿では、認証ユーザーの管理をweb.configではなく、独自に定義したXML文書で行う方法について紹介する。独自のXML文書を用いることで、ユーザーIDとパスワードだけではなく、より多様なユーザー属性を管理、アプリケーション内で利用することができるようになる。

1. ユーザー管理用のXML文書を用意する

 XML文書は2次元表に変換可能なフォーマットで、かつ、ユーザーIDとパスワードさえ含んでいれば、要素名・構造も含めて特別な制約はない。例えば、本稿では以下のようなXML文書(usr.config)を用意してみた。

<?xml version="1.0" encoding="Shift_JIS" ?>
<users>
  <usr>
    <uid>yyamada</uid>
    <passwd>8CB2237D0679CA88DB6464EAC60DA96345513964</passwd>
    <unam>山田祥寛</unam>
    <depart>営業第2課</depart>
    <role>admin,super,usr</role>
  </usr>
  <!--中略-->
</users>
独自に定義したユーザー管理用のXML文書(usr.config)

 usr.configでは、仮にユーザーID(uid)、パスワード(passwd)、ユーザー名(unam)、所属部門(depart)、カンマ区切りの権限(role)などの情報を定義している。パスワードはあらかじめSHA1方式で暗号化したものを記述している。暗号化の方法については、別稿「TIPS:[ASP.NET]フォーム認証用のパスワードを暗号化するには?」を参照いただきたい。

 あえて拡張子を「.config」としているのは、HTTP経由でユーザー情報にアクセスできてしまうのを防ぐためだ。ユーザー情報が不特定多数のユーザーから参照できる状態にしておくのは、セキュリティの観点からも当然好ましくない。

2. web.configの設定を行う

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

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

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

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

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

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Data" %>
<script runat="Server">
void objBtn_Click(Object sender, EventArgs e) {
  // ユーザー管理XML文書usr.configの内容を読み込み、DataSetに展開
  DataSet objDs=new DataSet();
  objDs.ReadXml(Server.MapPath("usr.config"));
  // DataSetの内容をフィルタ可能なDataViewオブジェクトに変換
  DataView objView=objDs.Tables["usr"].DefaultView;
  // 入力されたユーザーID、パスワードでDataView内のレコード群をフィルタ処理
  objView.RowFilter="uid='" + txtUsr.Text + "' AND passwd='" + FormsAuthentication.HashPasswordForStoringInConfigFile(txtPass.Text,"SHA1") + "'";
  // フィルタ処理の結果、該当するレコードが存在した場合、認証は成功
  if(objView.Count>0){
    FormsAuthentication.RedirectFromLoginPage(txtUsr.Text,false);
  }else{
    objLbl.Text="正しいユーザーID、パスワードを入力してください";
  }
}
</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#:xml_login_cs.aspx)
 
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Data" %>
<script runat="Server">
Sub objBtn_Click(sender As Object, e As EventArgs)
  ' ユーザー管理XML文書usr.configの内容を読み込み、DataSetに展開
  Dim objDs As New DataSet()
  objDs.ReadXml(Server.MapPath("usr.config"))
  ' DataSetの内容をフィルタ可能なDataViewオブジェクトに変換
  Dim objView As DataView=objDs.Tables("usr").DefaultView
  ' 入力されたユーザーID、パスワードでDataView内のレコード群をフィルタ処理
  objView.RowFilter="uid='" & txtUsr.Text & "' AND passwd='" & FormsAuthentication.HashPasswordForStoringInConfigFile(txtPass.Text,"SHA1") & "'"
  ' フィルタ処理の結果、該当するレコードが存在した場合、認証は成功
  If objView.Count>0 Then
    FormsAuthentication.RedirectFromLoginPage(txtUsr.Text,False)
  Else
    objLbl.Text="正しいユーザーID、パスワードを入力してください"
  End If
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.NETxml_login_vb.aspx)

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

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

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

カテゴリ:Webフォーム 処理対象:構成ファイル
カテゴリ:Webフォーム 処理対象:認証
使用ライブラリ:FormsAuthenticationクラス(System.Web.Security名前空間)
関連TIPS:[ASP.NET]構成ファイルのみでフォーム認証を実現するには?

関連TIPS:[ASP.NET]フォーム認証用のパスワードを暗号化するには?
関連TIPS:[ASP.NET]認証後のページでカスタムのユーザー情報を引用するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]フォーム認証のユーザー管理をデータベース・サーバで行うには?
[ASP.NET]構成ファイルのみでフォーム認証を実現するには?
[ASP.NET]認証後のページでカスタムのユーザー情報を引用するには?
[ASP.NET]フォーム認証用のパスワードを暗号化するには?
[ASP.NET AJAX]クライアントサイド・スクリプトからカスタムの認証機能を利用するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間