WebSurfer's Home

APMLフィルター

ユーザー登録時のプロファイル情報取得

by WebSurfer 2010年8月1日 16:26

CreateUserWizard を利用して新規ユーザー登録をする際に、ユーザーの漢字の氏名、住所などのユーザープロファイル情報を取得し、ASP.NET プロファイルを使用して保存する方法の紹介です。

プロファイル情報の取得

MSDN ライブラリの CreateUserWizard クラス の 3 番目のコード例に、ユーザーの氏名をプロファイル情報として取得する方法が書かれています。

でも、これではうまくいきません。以下の問題があります。

  1. web.config に <anonymousIdentification enabled="true" /> が必須(サンプルには書いてない)。
  2. サンプルには <add name="userName" /> としか書いてないが、それでは allowAnonymous がデフォルトの false となり、Profile.SetPropertyValue メソッドで、ProviderException 例外がスローされる。
  3. allowAnonymous を true にすると成功するように見えるが、匿名ユーザーの UserId の方にのみプロファイルデータが登録され、新規認証済みユーザーの UserId には登録されない。結果、新規認証済みユーザーの ID とパスワードで再ログインしてもプロファイルデータは取得できない。

上記の問題を解決して MSDN ライブラリのサンプルを書き換えると、以下のようになります。なお、サンプルの userName は KanjiName に変更していますので注意してください。

web.config の設定

1
2
3
4
5
6
7
<anonymousIdentification  enabled="true" />
 
<profile>
    <properties>
        <add name="KanjiName" />
    </properties>
</profile>

.aspx のコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<%@ 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 イベントハンドラで処置するのが適当かもしれません。

現在のレート 5.0 (1人)

  • Currently 5.0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

ASP.NET

anonymousIdentification の取得

by WebSurfer 2010年7月31日 16:04

これはあまり役に立たないかもしれませんが・・・

プロファイル機能を使用する場合、認証されていないエンティティ(匿名ユーザー)を識別するための ID が必要になります。

anonymousIdentification 要素の enabled 属性を true に設定すると(デフォルトでは false)、ASP.NET は、匿名ユーザーに自動的に ID を与えます。以下は、その ID の取得方法です。

まず、web.config で、anonymousIdentification 要素と profile 要素を設定します。以下の設定は最低限必要です。

1
2
3
4
5
6
7
<anonymousIdentification enabled="true" />
 
<profile>
  <properties>
     <add name="Dummy" />
  </properties>
</profile>

上記では properties の name はとりあえず Dummy としていますが、実際にプロファイルを使用する場合は適切な名前をつけてください(例えば、ユーザーの漢字の名前をプロファイルに保存する場合は KanjiName にするなど)。

ユーザーを識別するための ID は以下のようにして取得できます。

1
string anonymousId = Profile.UserName;

Froms 認証では、匿名ユーザーの ID は 14106048-46df-4104-a78d-0fda2b577365 のような Guid の文字列になり、認証されると登録済みのユーザー名に変わります。

最初のレートをつける

  • Currently .0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

ASP.NET

Safari は downlevel browser?

by WebSurfer 2010年7月30日 23:14

ブラウザ Safai

Windows 版でしかチェックしていませんが、最新の Safari 5.0.1 は ASP.NET 3.5 でも依然として downlevel(Internet Explorer 4.0 より前のブラウザ)として扱われているようです。

(2014/3/3 追記: 現時点の ASP.NET によるブラウザ判定で Safari が downlevel と判断されることはありません。ただし、ASP.NET 2.0, 3.0, 3.5 での Menu コントロールについては話が別です。詳しくは下の「2014/3/3 追記」を見てください)

2 年ほど前、Menu コントロールの子メニュー/孫メニューをポップアップするスクリプトが生成されないことでこの問題を知りました。

2006 年の初めには Connect にレポートされていますが、そのままになっているようです(ただし、ASP.NET 4.0 でどうなったかは未確認です)。(2011/8/22 追記: ASP.NET 4 では対処済みでした。下の追記を参照)

ニュースグループ Microsoft Discussion Groups に応急処置が書いてあったんですが、すでにリンク切れになっているので、ここにそれを書いておきます。

応急処置は、簡単に言うと、Page クラスの PreInit イベントで "uplevel" であると誤魔化すということです。

具体的には、PreInit イベントで HTTP ヘッダーの中の User-Agent を調べ、Safari という文字列があったら、そこで Page.ClientTarge プロパティを uplevel に設定するというものです。

つまり、以下のようなクラスを作って、"uplevel" に誤魔化す必要のあるページはこれを継承してページを実装するということです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CBaseMasterEvents : System.Web.UI.Page
{
  public CBaseMasterEvents()
  {
    Page.PreInit += new EventHandler(CBaseMaster_PreInit);
  }
 
  private void CBaseMaster_PreInit(object sender, EventArgs e)
  {
    if (Page.Request.Browser.Browser.Contains("Safari"))
    {
      Page.ClientTarget = "uplevel";
    }
  }
}

ただし、この応急処置を適用すると、他の部分で互換性の問題が出る恐れがありますので、十分な検証が必要だと思います。


------ 2011/8/22 追記 ------

原因は ASP.NET 2.0 の CONFIG フォルダにあるブラウザ定義ファイル *.browser に Safari 用がないからでした(downlevel と定義されていうわけではなかったです)。それは Chrome も同じで、Menu コントロールは適切に表示されません。

(2014/3/3 追記: 「Menu コントロールは適切に表示されません」という表現は間違ってました。詳しくは下の「2014/3/3 追記」を見てください)

ASP.NET 4 の CONFIG フォルダには safari.browser, chrome.browser が含まれており、Menu コントロールは IE と同様に適切に表示されます。


------ 2014/3/3 追記 ------

ASP.NET 2.0, 3.0, 3.5 用のブラウザ定義ファイルは %windir%\Microsoft.NET\Framework\v2.0.50727 (ASP.NET 4 用は \v4.0.30319)の CONFIG\Browsers サブフォルダにあります。

昔のブラウザ定義ファイルは分かりませんが(Windows Update でアップデートされるので)、2014/3/3 時点では mozilla.browser ファイルの中に id="Safari" という browser 要素があって、Safari および Chrome はその定義の適用を受けます(継承元の Default ← Mozilla ← Gecko の定義も)。

その browser 要素の中に controlAdapters 要素(使用するコントロールアダプタを定義)が含まれており、それが Menu サーバーコントロール用のアダプタに、以下のように MenuAdapter クラス を使うよう指定しています。

1
2
3
4
5
<controlAdapters>
 <adapter
  controlType="System.Web.UI.WebControls.Menu"
  adapterType="System.Web.UI.WebControls.Adapters.MenuAdapter" />
</controlAdapters>

このため、ASP.NET 2.0, 3.0, 3.5 では、Menu コントロールが html コードにレンダリングされた時、Safari, Chrome は span 要素、IE, Firefox は table 要素になり、ブラウザ上での動作が大幅に異なるという結果になります。

一方、ASP.NET 4 の CONFIG\Browsers サブフォルダには safari.browser, chrome.browser という専用のブラウザ定義ファイルがあり、その中にも継承元の Default ← Mozilla ← WebKit にも controlAdapters 要素は含まれていません。

それゆえ、ASP.NET 4 では、Menu コンロトールは IE, Forefox, Safari, Chrome いずれも同じ table 要素としてレンダリングされ、ブラウザ上での動作は同じになります。

(注)ASP.NET が CONFIG\Browsers サブフォルダのブラウザ定義ファイルの通りにブラウザを判定するかと言えば、必ずしもそういうわけではないので注意してください。ASP.NET はブラウザ判定ルーチンを System.Web.dll の中に持っており、既定ではそれを使っているそうです。詳しくは MSDN Blog の記事 ASP.NET の IE10 対応について を見てください。


------ 2016/1/12 追記 ------

MaintainScrollPositionOnPostBack(ポストバック前後で上下左右のスクロール位置を維持する機能)も ASP.NET 2.0, 3.0, 3.5 ではブラウザ定義の問題で Safari, Chrome では動きませんでした。(ASP.NET 4 では問題なし)

スクロール位置を維持する仕組み、Safari, Chrome のブラウザ定義は何故ダメか、その対処方法については別の記事「ポストバック前後でスクロール位置維持」に書きましたので、興味がありましたら見てください。

現在のレート 4.0 (1人)

  • Currently 4.0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

ASP.NET

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。ブログ2はそれ以外の日々の出来事などのトピックスになっています。

Calendar

<<  2025年1月  >>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar