ASP.NET EC のホームへ戻る

■メンバーシップ/ロールの API

 

ASP.NET 2.0ではLoginChangePasswordPasswordRecoveryCreateUserWizardなどフォーム認証を実装するのに便利なWebコントロールが追加されました。ところが、ASP.NET 2.0でモバイル版のWebサイトを構築するときは、これらのWebコントロールを利用することができません。ASP.NET 2.0 Mobileでは、代わりにメンバーシップとロールのAPIを利用してフォーム認証を実装します。

 

ASP.NET 2.0でモバイルサイトを構築するには、VWD 2005の「ファイル」メニューから[新しいWebサイト]を選択して「テンプレート」から[ASP.NETサイト]を選択します。ここまでは通常のWebサイトと同様です。新規プロジェクトのソリューションエクスプローラに、「Default.aspx」と「Web.config」ファイルが作成されますので右クリックから[削除]を選択して消去します。

 

次に、プロジェクトの右クリックから[新しい項目の追加]を選択したら「テンプレート」から[モバイルWeb構成ファイル]を選択します。モバイル版のWeb.configファイルが作成されてソリューションエクスプローラに表示されます。これでモバイル版のWebフォームが作成できます。

 

Web.configファイルをダブルクリックして表示したら、<system.web>セクションに<roleManger><authentication>要素を追加してロール管理とフォーム認証を組み込みます。

 

<system.web>

  <roleManager enabled="true"/>

  <authentication mode="Forms">

    <forms loginUrl="Login.aspx"/>

  </authentication>

</system.web>

 

 

●ログイン (Login.aspx)

 

MembershipクラスのValidateUserメソッドを使用してログインフォームを作成します。ソリューションエクスプローラの右クリックから[新しい項目の追加]を選択したら「テンプレート」から[モバイルWebフォーム]を選択して新規モバイルフォームを作成します。

 

ツールボックスの「モバイルWebフォーム」タブから[TextBox]をドラッグして、Form1に「ユーザー名」と「パスワード」のTextBoxを配置します。さらにツールボックスから[Command]をドラッグ&ドロップして[ログイン]ボタンを配置します。Form2にはLabelCommandを配置します。

 

11: モバイルWebフォームにLabelTextBoxCommandを配置する

fig10

 

 

[ログイン]ボタンのクリック時のイベントハンドラには、以下のようなコードを追加します。フォーム認証を行うには、MembershipクラスのValidateUserメソッドを実行します。このメソッドの引数には「ユーザー名」と「パスワード」を指定します。このメソッドからは、認証が成功すると「True」、失敗すると「False」が返ります。

 

Protected Sub cmdLogin_Click(ByVal sender As Object, _

  ByVal e As System.EventArgs) Handles cmdLogin.Click

  If Membership.ValidateUser(txtUserName.Text, txtPassword.Text) Then

    FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, False)

  Else

    ActiveForm = Form2

    lblMessage.Text = "認証できませんでした. 再入力してください..."

  End If

End Sub

 

VWD 2005の「Webサイト」メニューから[ASP.NET構成]を選択して新規ユーザー「Superman」を作成したら、VWD 2005のツールバーから[デバッグ開始]ボタンをクリックして実行します。「ユーザー名」と「パスワード」を入力して[ログイン]ボタンを押すと「ようこそ・・・」が表示されます。認証されなかったときはエラーが表示されます。

 

認証されているユーザーの名前は、Membership.GetUserオブジェクトのUserNameプロパティに格納されています。

 

Membership.GetUser.UserName

 

 

※本稿ではブラウザ(IE)の代わりに「iモードHTMLシミュレータII」を利用しています。このシミュレータは「http://www.nttdocomo.co.jp/p_s/imode/flash/tool2.html」からダウンロードできます。それから、シミュレータを使用するときは、Web.configファイルの<system.web>セクションに<sessionState>要素を追加してクッキーを無効にしてください。

 

<system.web>

  <sessionState cookieless="true" />

</system.web>

 

 

12:モバイルからログインした例

fig11afig11b

 

 

●新規ユーザー作成 (CreateUser.aspx)

 

モバイルWebフォームから新規ユーザーを作成するには、MembershipクラスのCreateUserメソッドを実行します。このメソッドの引数には、「ユーザー名」と「パスワード」を指定します。

 

※デフォルトの設定では、「メールアドレス」、「パスワード取得時の質問」、「質問の回答」を入力する必要がありますが、ここではWeb.configファイルに以下の<membership>要素を追加してパスワード取得機能を無効にしているためにこれらの情報は不要です。

 

<membership>

  <providers>

    <clear />

    <add name="AspNetSqlMembershipProvider"

      enablePasswordRetrieval="false"

      enablePasswordReset="true"

      requiresQuestionAndAnswer="false"

      applicationName="/"

      requiresUniqueEmail="false"

      passwordFormat="Hashed"

      maxInvalidPasswordAttempts="5"

      minRequiredPasswordLength="1"

      minRequiredNonalphanumericCharacters="0"

      passwordAttemptWindow="10".../>

  </providers>

</membership>

 

テキストボックスに「ユーザー名」と「パスワード」を入力して[作成]ボタンを押すと、App_Dataフォルダに格納されているASPNETDB.MDFデータベースに新規ユーザーが追加されます。ASPNETDB.MDFからすべてのユーザーを取得するには、MembershipクラスのGetAllUsersメソッドを実行します。ここでは、GetAllUsersメソッドで取得したすべてのユーザーをSelectionListコントロールに表示しています。

 

Protected Sub cmdCreate_Click(ByVal sender As Object, _

  ByVal e As System.EventArgs) Handles cmdCreate.Click

  Try

    Dim newUser As MembershipUser = Membership.CreateUser( _

      txtUserName.Text, txtPassword.Text)

    lblMessage.Text = String.Format("{0}」さんを追加しました.", _

      txtUserName.Text)

  Catch ex As MembershipCreateUserException

    lblMessage.Text = GetErrorMessage(ex.StatusCode)

  Catch ex As Exception

    lblMessage.Text = ex.Message

  End Try

  ActiveForm = Form2

  SelectionList1.DataSource = Membership.GetAllUsers

  SelectionList1.DataBind()

End Sub

 

13: モバイルWebフォームにTextBoxCommandSelectionListを配置

fig12

 

14: モバイルから新規ユーザー「Taro」を追加

fig13afig13b

 

●新規ロール作成 (CreateRole.aspx)

 

ASPNETDB.MDFデータベースに新規ロールを作成するには、RolesクラスのCreateRoleメソッドを実行します。このメソッドの引数にはロール名を指定します。ASPNETDB.MDFデータベースからすべてのロールを取得するには、RolesクラスのGetAllRolesメソッドを実行します。ここではGetAllRolesで取得したすべてのロールをSelectionListに表示しています。

 

Protected Sub cmdCreate_Click(ByVal sender As Object, _

  ByVal e As System.EventArgs) Handles cmdCreate.Click

  Roles.CreateRole(txtRole.Text)

  ActiveForm = Form2

  SelectionList1.DataSource = Roles.GetAllRoles

  SelectionList1.DataBind()

End Sub

 

15: モバイルから新規ロールを追加

fig14afig14b

 

 

●ユーザーをロールに追加 (AddUserToRole.aspx)

 

ユーザーをロールに追加するには、RolesクラスのAddUserToRoleメソッドを実行します。このメソッドの引数には、ユーザー名とロール名を指定します。ユーザー名とロール名はSelectionListSelection.Textプロパティから取得します。ロールに登録されているすべてのユーザーを取得するには、RolesクラスのGetUsersInRoleメソッドを実行します。このメソッドの引数にはロール名を指定します。ここではGetUsersInRoleメソッドで取得したすべてのユーザーをSelectionListに表示しています。

 

Protected Sub cmdAddUserToRole_Click(ByVal sender As Object, _

  ByVal e As System.EventArgs) Handles cmdAddUserToRole.Click

  Dim strUser As String = Me.slstUsers.Selection.Text

  Dim strRole As String = Me.slstRoles.Selection.Text

  Roles.AddUserToRole(strUser, strRole)

  ActiveForm = Form3

  lblMessage.Text = String.Format("{0}」のユーザー", _

    strRole)

  slstUsersInRole.DataSource = Roles.GetUsersInRole(strRole)

  slstUsersInRole.DataBind()

End Sub

 

16: SelectionListからユーザー名とロール名を選択してユーザーをロールに追加する

fig15afig15bfig15c

 

ASP.NET EC のホームへ戻る