by WebSurfer
2010年8月1日 16:26
CreateUserWizard を利用して新規ユーザー登録をする際に、ユーザーの漢字の氏名、住所などのユーザープロファイル情報を取得し、ASP.NET プロファイルを使用して保存する方法の紹介です。
MSDN ライブラリの CreateUserWizard クラス の 3 番目のコード例に、ユーザーの氏名をプロファイル情報として取得する方法が書かれています。
でも、これではうまくいきません。以下の問題があります。
-
web.config に <anonymousIdentification enabled="true" /> が必須(サンプルには書いてない)。
-
サンプルには <add name="userName" /> としか書いてないが、それでは allowAnonymous がデフォルトの false となり、Profile.SetPropertyValue メソッドで、ProviderException 例外がスローされる。
-
allowAnonymous を true にすると成功するように見えるが、匿名ユーザーの UserId の方にのみプロファイルデータが登録され、新規認証済みユーザーの UserId には登録されない。結果、新規認証済みユーザーの ID とパスワードで再ログインしてもプロファイルデータは取得できない。
上記の問題を解決して MSDN ライブラリのサンプルを書き換えると、以下のようになります。なお、サンプルの userName は KanjiName に変更していますので注意してください。
web.config の設定
<anonymousIdentification enabled="true" />
<profile>
<properties>
<add name="KanjiName" />
</properties>
</profile>
.aspx のコード
<%@ page language="C#"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{
ProfileCommon profile =
(ProfileCommon)ProfileCommon.Create(
CreateUserWizard1.UserName, true);
profile.KanjiName = lastName.Text + " " + firstName.Text;
profile.Save();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>CreateUserWizard.CreatedUser サンプル</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:createuserwizard
id="CreateUserWizard1"
oncreateduser="CreateUserWizard1_CreatedUser"
runat="server">
<wizardsteps>
<asp:wizardstep
ID="Wizardstep1"
runat="server"
steptype="Start"
title="Identification">
氏名を記入してください:<br />
<table width="100%">
<tr>
<td>
姓:</td>
<td>
<asp:textbox id="lastName" runat="server" />
</td>
</tr>
<tr>
<td>
名:</td>
<td>
<asp:textbox id="firstName" runat="server" />
</td>
</tr>
</table>
</asp:wizardstep>
<asp:createuserwizardstep
ID="Createuserwizardstep1"
runat="server"
title="Sign Up for Your New Account">
</asp:createuserwizardstep>
</wizardsteps>
</asp:createuserwizard>
</div>
</form>
</body>
</html>
なお、allowAnonymous="true" としておくと、aspnet_Users に匿名ユーザーが残ってしまうことがあるので、ユーザー登録のときに記入してもらう漢字名などのデータは、allowAnonymous="false" としておくのが正解のようです。
また、例えば買い物籠のように、最初は匿名ユーザーとして入力され、ある時点で認証ユーザーとなって購入に進むような場合は、MSDN ライブラリの ASP.NET プロファイル プロパティのユーザー ID の例に示すように
Global.asax の Profile_OnMigrateAnonymous イベントハンドラで処置するのが適当かもしれません。