.NET TIPS

[ASP.NET]認証後のページでカスタムのユーザー情報を引用するには?

山田 祥寛
2004/04/23

 別稿「TIPS:[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?」「TIPS:[ASP.NET]フォーム認証のユーザー管理をデータベース・サーバで行うには?」では、それぞれ認証用のユーザーをカスタムのXMLデータ、データベース・サーバで管理する方法について紹介した。本稿では、これら任意の媒体を採用したことで拡張可能となった一連のユーザー属性を、各Webフォームからアクセスする方法について紹介しよう。

 ロジックは極めて明快なので、カスタムのXMLデータ、データベース・サーバそれぞれの場合について、具体的なソース・コードを見てみることにしよう。認証済みユーザーのIDをキーにしてユーザー属性を検索するというのが基本的な方法だ。

(1)カスタムのXMLデータの場合

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Data" %>
<script runat="Server">
void Page_Load(Object sender, EventArgs e) {
  // ユーザー管理XML文書usr.configの内容を読み込み、DataSetに展開
  DataSet objDs=new DataSet();
  objDs.ReadXml(Server.MapPath("/netIns/usr.config"));
  // DataSetの内容をフィルタ可能なDataViewオブジェクトに変換
  DataView objView=objDs.Tables["usr"].DefaultView;
  // 認証済みユーザーIDをキーにDataView内のレコード群をフィルタ処理
  // ユーザーIDは、User.Identity.Nameプロパティで取得することが
  // できる

  objView.RowFilter="uid='" + User.Identity.Name + "'";
  // 取得したレコード群の1行目(ユーザーIDはユニークなので、
  // フィルタ後のレコード
は常に1行しか存在しない)から
  // 各フィールド値を取得し、ラベルに反映
  if(objView.Count>0){
    lblUid.Text=objView[0]["uid"].ToString();
    lblUnam.Text=objView[0]["unam"].ToString();
    lblDepart.Text=objView[0]["depart"].ToString();
    lblRole.Text=objView[0]["role"].ToString();
  }
}
</script>
<html>
<head>
<title>認証ユーザー情報の引用</title>
</head>
<body>
<h1>認証ユーザー情報の引用</h1>
<table border="1">
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ユーザーID</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblUid" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ユーザー名</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblUnam" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">所属部門</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblDepart" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ロール名</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblRole" runat="Server" /></td>
</tr>
</table>
</body>
</html>
XMLデータで拡張されたユーザー属性にアクセスするWebフォーム(xml_read_cs.aspx)
 
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Data" %>
<script runat="Server">
Sub Page_Load(sender As Object, e As EventArgs)
  ' ユーザー管理XML文書usr.configの内容を読み込み、DataSetに展開
  Dim objDs As New DataSet()
  objDs.ReadXml(Server.MapPath("/netIns/usr.config"))
  ' DataSetの内容をフィルタ可能なDataViewオブジェクトに変換
  Dim objView As DataView=objDs.Tables("usr").DefaultView
  ' 認証済みユーザーIDをキーにDataView内のレコード群をフィルタ処理
  ' ユーザーIDは、User.Identity.Nameプロパティで取得することが
  ' できる

  objView.RowFilter="uid='" & User.Identity.Name & "'"
  ' 取得したレコード群の1行目(ユーザーIDはユニークなので、
  ' フィルタ後のレコード
は常に1行しか存在しない)から
  ' 各フィールド値を取得し、ラベルに反映
  If objView.Count>0 Then
    lblUid.Text=objView.Item(0).Item("uid")
    lblUnam.Text=objView.Item(0).Item("unam")
    lblDepart.Text=objView.Item(0).Item("depart")
    lblRole.Text=objView.Item(0).Item("role")
  End If
End Sub
</script>
<html>
<head>
<title>認証ユーザー情報の引用</title>
</head>
<body>
<h1>認証ユーザー情報の引用</h1>
<table border="1">
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ユーザーID</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblUid" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ユーザー名</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblUnam" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">所属部門</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblDepart" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ロール名</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblRole" runat="Server" /></td>
</tr>
</table>
</body>
</html>
XMLデータで拡張されたユーザー属性にアクセスするWebフォーム(xml_read_vb.aspx)

(2)データベース・サーバの場合

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
void Page_Load(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",objDb);
  objCom.Parameters.Add("@uid",User.Identity.Name);
  objDb.Open();
  SqlDataReader objDr=objCom.ExecuteReader();
  // 取得したレコード群の1行目(ユーザーIDはユニークなので、
  // フィルタ後のレコード
は常に1行しか存在しない)
  // から各フィールド値を取得し、ラベルに反映
  if(objDr.Read()){
    lblUid.Text=objDr.GetString(0);
    lblUnam.Text=objDr.GetString(2);
    lblDepart.Text=objDr.GetString(3);
    lblRole.Text=objDr.GetString(4);
  }
}
</script>
<html>
<head>
<title>認証ユーザー情報の引用</title>
</head>
<body>
<h1>認証ユーザー情報の引用</h1>
<table border="1">
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ユーザーID</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblUid" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ユーザー名</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblUnam" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">所属部門</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblDepart" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ロール名</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblRole" runat="Server" /></td>
</tr>
</table>
</body>
</html>
データベース・サーバで拡張されたユーザー属性にアクセスするWebフォーム(db_read_cs.aspx)
 
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
Sub Page_Load(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",objDb)
  objCom.Parameters.Add("@uid",User.Identity.Name)
  objDb.Open()
  Dim objDr As SqlDataReader=objCom.ExecuteReader()
  ' 取得したレコード群の1行目(ユーザーIDはユニークなので、
  ' フィルタ後のレコード
は常に1行しか存在しない)
  ' から各フィールド値を取得し、ラベルに反映
  If objDr.Read() Then
    lblUid.Text=objDr.GetString(0)
    lblUnam.Text=objDr.GetString(2)
    lblDepart.Text=objDr.GetString(3)
    lblRole.Text=objDr.GetString(4)
  End If
End Sub
</script>
<html>
<head>
<title>認証ユーザー情報の引用</title>
</head>
<body>
<h1>認証ユーザー情報の引用</h1>
<table border="1">
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ユーザーID</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblUid" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ユーザー名</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblUnam" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">所属部門</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblDepart" runat="Server" /></td>
</tr>
<tr>
  <th align="right" bgcolor="PaleGoldenrod">ロール名</th>
  <td bgcolor="LightGoldenrodYellow">
    <asp:Label id="lblRole" runat="Server" /></td>
</tr>
</table>
</body>
</html>
データベース・サーバで拡張されたユーザー属性にアクセスするWebフォーム(db_read_vb.aspx)

 User.Identityプロパティは認証済みのユーザー情報を表すIIdentityオブジェクトを返す。IIdentityオブジェクトは標準で以下のプロパティを公開し、認証済みユーザーに関する基本的な情報を取得することができる。

プロパティ 概要
AuthenticationType 認証の種類
IsAuthenticated ユーザーが認証されているかどうか
Name ユーザー名
IIdentityオブジェクトの主なプロパティ

 IIdentity.Nameプロパティによって、認証済みユーザーのIDさえ取得してしまえば、後はバックエンドのデータ・ストアが何であっても、考え方は同じだ。ユーザーIDをキーにして、対応するユーザー属性の情報を取得してくればよい。

 本稿のサンプル・プログラムは、単純に取得したユーザー情報をWebフォーム上に表示するだけであるが、拡張属性はアイデア次第でさまざまな局面で利用できるはずだ。例えば、画面のカスタマイズ情報をユーザーごとに持たせておくことで、「アプリケーションのパーソナライゼ―ション(個人化)」を実現することができる。また、本稿のデータにも含まれるロール(役割)情報を利用することで、より柔軟なアクセス制御が可能になるはずである。これらについても、機会があれば、別稿で詳述できればと思っている。End of Article

カテゴリ:Webフォーム 処理対象:認証
関連TIPS:[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?
関連TIPS:[ASP.NET]フォーム認証のユーザー管理をデータベース・サーバで行うには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]フォーム認証のユーザー管理をデータベース・サーバで行うには?
[ASP.NET]フォーム認証のユーザー管理をXMLファイルで行うには?
[ASP.NET]構成ファイルのみでフォーム認証を実現するには?
[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 記事ランキング

本日 月間