|
.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 記事ランキング
本日
月間