AddUser.aspx ファイル
ログオン ページは、Users.xml ファイルに該当する電子メール名が見つからない場合には、要求を [ユーザーの追加] ページにリダイレクトします。ユーザーが [ユーザーの追加] ボタンをクリックすると、ユーザー名とパスワードがファイルに追加されます。
[ユーザーの追加] ページを実装するには
必要な名前空間をインポートします。
<%@ Page LANGUAGE="c#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Web.Security " %> <%@ Import Namespace="System.IO" %> <html> <head> <title>Forms Authentication</title>
スクリプト セクションのタグを作成します。
<script runat=server>
Page_Load 関数を実装します。
private void Page_Load(Object Src, EventArgs e) {
要求から
UserEmail
文字列とUserPassword
文字列を取得します。String email = Request.QueryString["UserEmail"];
null でない場合は、[UserEmail] ボックスにユーザーの電子メール名を入れます。UserEmail は、既に RegularExpressionValidator コントロールによって Logon.aspx ページで検証されています。
if( null != email ) UserEmail.Value = email; }
AddUser_Click 関数を実装します。2 つのクライアントがほぼ同時に AddUser.aspx を呼び出すと、競合状態が発生します。タイミングがよければ、一方のクライアントが新しいデータで Users.xml ファイルのコピーを書き込み、もう一方のクライアントが最初のクライアントによって書き込まれたファイルを上書きできます。競合状態が問題になる場合は、クライアントが同時に AddUser.aspx ファイルを実行できないようにするために、なんらかの同期機構をアプリケーションに設ける必要があります。この機構は、どのクライアントも AddUser_Click イベントのコードを実行する直前に排他的に要求するミューテックスとして動作するアプリケーション変数のようなシンプルなものでかまいません。
private void AddUser_Click(Object sender, EventArgs e) {
ページが有効でない場合は、ユーザーに対してメッセージを表示します。
if( !Page.IsValid ) { Msg.Text = "Some required fields are invalid."; return; }
ds
という名前で DataSet のインスタンスを作成します。DataSet ds = new DataSet();
userFile
という文字列を Users.xml ファイルへのパスに初期化します。String userFile = "../users.xml";
手順 b. で作成した
ds
という DataSet に XML ファイルを読み込みます。FileStream fs = new FileStream(Server.MapPath(userFile), FileMode.Open,FileAccess.Read); StreamReader reader = new StreamReader(fs); ds.ReadXml(reader); fs.Close();
パスワードをハッシュし、新しい名前とハッシュしたパスワードを DataSet の
ds
に追加します。string hashedpwd = FormsAuthentication.HashPasswordForStoringInConfigFile (UserPass.Value, "SHA1"); DataRow newUser = ds.Tables[0].NewRow(); newUser["UserEmail"] = UserEmail.Value; newUser["UserPassword"] = hashedpwd; ds.Tables[0].Rows.Add(newUser); ds.AcceptChanges();
新しい名前とパスワードを追加した新しい DataSet を XML ファイルに書き込みます。
fs = new FileStream(Server.MapPath(userFile), FileMode.Create, FileAccess.Write|FileAccess.Read); StreamWriter writer = new StreamWriter(fs); ds.WriteXml(writer); writer.Close(); fs.Close();
要求を最初に要求されたリソース (Default.aspx) にリダイレクトし、ログオン プロセスをもう一度開始します。次に示すフォームは、ボタン名を除いて、Logon.aspx ファイルで説明したフォームと同じです。
Response.Redirect("../Default.aspx"); } </script> <body> <form runat=server> <div style="background:#ccccff"> <h3><font face="Verdana">Add New User</font></h3> </div>
<table>
<tr>
<td>Name:</td>
<td><input id="UserEmail" type="text" runat=server/></td>
<td><ASP:RequiredFieldValidator
ControlToValidate="UserEmail"
Display="Static"
ErrorMessage="*"
runat=server/>
</td>
<td><asp:RegularExpressionValidator id="RegexValidator"
ControlToValidate="UserEmail"
ValidationExpression="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"
EnableClientScript="false"
Display="Static"
ErrorMessage="Invalid format for e-mail address."
runat="server"/>
</td>
</tr>
<tr>
<td>Password:</td>
<td><input id="UserPass" type=password runat=server/></td>
<td><ASP:RequiredFieldValidator
ControlToValidate="UserPass"
Display="Static"
ErrorMessage="*"
runat=server/>
</td>
</tr>
<tr>
<td>Persistent Forms:</td>
<td><ASP:CheckBox id=Persist runat="server"
autopostback="true"/>
</td>
</tr>
</table>
< input type="submit" OnServerClick="AddUser_Click" Value="Add User"
runat="server"/><p>
<asp:Label id="Msg" ForeColor="red" Font-Name="Verdana"
Font-Size="10" runat=server/>
</form>
</body>
</html>