|   | 
| 
 .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フォーム上に表示するだけであるが、拡張属性はアイデア次第でさまざまな局面で利用できるはずだ。例えば、画面のカスタマイズ情報をユーザーごとに持たせておくことで、「アプリケーションのパーソナライゼ―ション(個人化)」を実現することができる。また、本稿のデータにも含まれるロール(役割)情報を利用することで、より柔軟なアクセス制御が可能になるはずである。これらについても、機会があれば、別稿で詳述できればと思っている。
 
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間