ユーザー アカウントを作成する (VB)
注意
この記事が作成されて以来、ASP.NET メンバーシップ プロバイダーは ASP.NET Identity に置き換えられました。 この記事の執筆時点で取り上げられたメンバーシップ プロバイダーではなく 、ASP.NET ID プラットフォームを使用するようにアプリを更新することを強くお勧めします。 ASP.NET ID には、ASP.NET メンバーシップ システムに比して、次のような多くの利点があります。
- パフォーマンスの向上
- 拡張性とテスト性の向上
- OAuth、OpenID Connect、および 2 要素認証のサポート
- クレームベースの ID のサポート
- ASP.Net Core との相互運用性の向上
このチュートリアルでは、メンバーシップ フレームワーク (SqlMembershipProvider を使用) を使用して新しいユーザー アカウントを作成する方法について説明します。 プログラムと ASP を使用して新しいユーザーを作成する方法について説明します。NET の組み込みの CreateUserWizard コントロール。
はじめに
前のチュートリアルでは、データベースにアプリケーション サービス スキーマをインストールしました。これにより、 と SqlRoleProvider
でSqlMembershipProvider
必要なテーブル、ビュー、およびストアド プロシージャが追加されました。 これにより、このシリーズのチュートリアルの残りの部分に必要なインフラストラクチャが作成されました。 このチュートリアルでは、メンバーシップ フレームワーク (を使用) を使用して SqlMembershipProvider
新しいユーザー アカウントを作成する方法について説明します。 プログラムと ASP を使用して新しいユーザーを作成する方法について説明します。NET の組み込みの CreateUserWizard コントロール。
新しいユーザー アカウントを作成する方法に加えて、「フォーム認証の概要」チュートリアルで最初に作成したデモ Web サイトも更新する必要があります。 デモ Web アプリケーションには、ハードコーディングされたユーザー名とパスワードのペアに対してユーザーの資格情報を検証するログイン ページがあります。 さらに、 Global.asax
認証されたユーザーのカスタム IPrincipal
オブジェクトと IIdentity
オブジェクトを作成するコードも含まれています。 ログイン ページを更新して、メンバーシップ フレームワークに対するユーザーの資格情報を検証し、カスタム プリンシパルと ID ロジックを削除します。
それでは作業を始めましょう。
フォーム認証とメンバーシップチェックリスト
メンバーシップ フレームワークの使用を開始する前に、この時点に到達するために実行した重要な手順を確認しましょう。 フォーム ベースの認証シナリオで Membership フレームワークを と共 SqlMembershipProvider
に使用する場合は、Web アプリケーションでメンバーシップ機能を実装する前に、次の手順を実行する必要があります。
- フォーム ベースの認証を有効にします。 「フォーム認証の概要」で説明したように、フォーム認証は、要素の
mode
属性Forms
をWeb.config
に編集して設定<authentication>
することで有効になります。 フォーム認証が有効になっている場合、各受信要求は フォーム認証チケットを調べ、要求元を識別します (存在する場合)。 - アプリケーション サービス スキーマを適切なデータベースに追加します。 を
SqlMembershipProvider
使用する場合は、アプリケーション サービス スキーマをデータベースにインストールする必要があります。 通常、このスキーマは、アプリケーションのデータ モデルを保持するのと同じデータベースに追加されます。 SQL Serverのメンバーシップ スキーマの作成に関するチュートリアルでは、ツールをaspnet_regsql.exe
使用してこれを実現する方法について説明しました。 - Web アプリケーションの設定をカスタマイズして、手順 2. でデータベースを参照します。 SQL Serverのメンバーシップ スキーマの作成に関するチュートリアルでは、手順 2 で選択したデータベースを 使用するように
SqlMembershipProvider
Web アプリケーションを構成する 2 つの方法を示しました。接続文字列名をLocalSqlServer
変更するか、メンバーシップ フレームワーク プロバイダーの一覧に新しい登録済みプロバイダーを追加し、手順 2 のデータベースを使用するように新しいプロバイダーをカスタマイズします。
および フォーム ベースの認証を使用 SqlMembershipProvider
する Web アプリケーションを構築する場合は、 クラスまたは ASP.NET Login Web コントロールを Membership
使用する前に、次の 3 つの手順を実行する必要があります。 前のチュートリアルで既にこれらの手順を実行したので、メンバーシップ フレームワークの使用を開始する準備ができました。
手順 1: 新しい ASP.NET ページの追加
このチュートリアルと次の 3 つでは、メンバーシップに関連するさまざまな機能について説明します。 これらのチュートリアル全体で調べられたトピックを実装するには、一連の ASP.NET ページが必要です。 これらのページを作成してから、サイト マップ ファイル (Web.sitemap)
を作成しましょう。
まず、 という名前 Membership
のプロジェクトに新しいフォルダーを作成します。 次に、5 つの新しい ASP.NET ページをフォルダーに Membership
追加し、各ページをマスター ページに Site.master
リンクします。 ページに次の名前を付けます。
CreatingUserAccounts.aspx
UserBasedAuthorization.aspx
EnhancedCreateUserWizard.aspx
AdditionalUserInfo.aspx
Guestbook.aspx
この時点で、プロジェクトのソリューション エクスプローラーは図 1 に示すスクリーン ショットのようになります。
図 1: フォルダーに Membership
5 つの新しいページが追加されました (フルサイズの画像を表示する をクリックします)
各ページには、この時点で、マスター ページの ContentPlaceHolders MainContent
LoginContent
ごとに 1 つずつと という 2 つのコンテンツ コントロールが必要です。
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent"
Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent"
Runat="Server">
</asp:Content>
ContentPlaceHolder の LoginContent
既定のマークアップには、ユーザーが認証されているかどうかに応じて、サイトにログオンまたはログオフするためのリンクが表示されることを思い出してください。 ただし、Content コントロールが Content2
存在すると、マスター ページの既定のマークアップがオーバーライドされます。 フォーム認証の概要に関するチュートリアルで説明したように、これは、左側の列にログイン関連のオプションを表示しないページで役立ちます。
ただし、これら 5 つのページでは、ContentPlaceHolder のマスター ページの既定のマークアップを LoginContent
表示する必要があります。 そのため、Content コントロールの宣言型マークアップを Content2
削除します。 その後、5 つのページのマークアップのそれぞれに 1 つのコンテンツ コントロールのみを含める必要があります。
手順 2: サイト マップの作成
最も簡単な Web サイト以外はすべて、何らかの形式のナビゲーション ユーザー インターフェイスを実装する必要があります。 ナビゲーション ユーザー インターフェイスは、サイトのさまざまなセクションへのリンクの単純な一覧である場合があります。 または、これらのリンクをメニューまたはツリー ビューに配置することもできます。 ページ開発者は、ナビゲーション ユーザー インターフェイスの作成は、ストーリーの半分にすぎません。 また、サイトの論理構造を保守可能で更新可能な方法で定義するための手段も必要です。 新しいページが追加されるか、既存のページが削除されると、1 つのソース (サイト マップ) を更新し、それらの変更をサイトのナビゲーション ユーザー インターフェイスに反映できるようにする必要があります。
サイト マップの定義とサイト マップに基づくナビゲーション ユーザー インターフェイスの実装という 2 つのタスクは、サイト マップ フレームワークと、ASP.NET バージョン 2.0 で追加されたナビゲーション Web コントロールにより、簡単に実行できます。 サイト マップ フレームワークを使用すると、開発者はサイト マップを定義し、プログラム API (クラス) を使用してサイト マップにSiteMap
アクセスできます。 組み込みのナビゲーション Web コントロールには、 Menu コントロール、 TreeView コントロール、 および SiteMapPath コントロールが含まれます。
メンバーシップおよびロール フレームワークと同様に、サイト マップ フレームワークは プロバイダー モデルの上に構築されます。 Site Map プロバイダー クラスのジョブは、XML ファイルやデータベース テーブルなどの永続的なデータ ストアから、 クラスによって SiteMap
使用されるメモリ内構造を生成することです。 .NET Frameworkには、XML ファイル (XmlSiteMapProvider
) からサイト マップ データを読み取る既定のサイト マップ プロバイダーが付属しています。これは、このチュートリアルで使用するプロバイダーです。 いくつかの別のサイト マップ プロバイダーの実装については、このチュートリアルの最後にある「その他の読み取り」セクションを参照してください。
既定のサイト マップ プロバイダーでは、 という名前 Web.sitemap
の適切な形式の XML ファイルがルート ディレクトリに存在することを想定しています。 この既定のプロバイダーを使用しているため、このようなファイルを追加し、適切な XML 形式でサイト マップの構造を定義する必要があります。 ファイルを追加するには、ソリューション エクスプローラーでプロジェクト名を右クリックし、[新しい項目の追加] を選択します。 ダイアログ ボックスで、 という名前 Web.sitemap
のサイト マップの種類のファイルを追加することを選択します。
図 2: プロジェクトのルート ディレクトリにという名前 Web.sitemap
のファイルを追加する (フルサイズの画像を表示する をクリックします)
XML サイト マップ ファイルは、Web サイトの構造を階層として定義します。 この階層関係は、 要素の祖先を介して XML ファイルで <siteMapNode>
モデル化されます。 はWeb.sitemap
、正確に 1 つの<siteMapNode>
子を<siteMap>
持つ親ノードで始まる必要があります。 この最上位要素 <siteMapNode>
は階層のルートを表し、任意の数の子孫ノードを持つことができます。 各<siteMapNode>
要素には 属性をtitle
含める必要があり、必要に応じて および description
属性を含url
めることができます。空url
でない各属性は一意である必要があります。
ファイルに次の XML を Web.sitemap
入力します。
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode url="~/Default.aspx" title="Home">
<siteMapNode title="Membership">
<siteMapNode url="~/Membership/CreatingUserAccounts.aspx" title="Creating User Accounts" />
<siteMapNode url="~/Membership/UserBasedAuthorization.aspx" title="User-Based Authorization" />
<siteMapNode url="~/Membership/Guestbook.aspx" title="Storing Additional User Information" />
</siteMapNode>
</siteMapNode>
</siteMap>
上のサイト マップ マークアップでは、図 3 に示す階層が定義されています。
図 3: サイト マップは階層ナビゲーション構造を表します (フルサイズの画像を表示する をクリックします)
手順 3: ナビゲーション ユーザー インターフェイスを含むようにマスター ページを更新する
ASP.NET には、ユーザー インターフェイスを設計するためのナビゲーション関連の Web コントロールが多数含まれています。 これには、Menu、TreeView、および SiteMapPath コントロールが含まれます。 Menu コントロールと TreeView コントロールは、それぞれメニューまたはツリーにサイト マップ構造をレンダリングしますが、SiteMapPath には、アクセスされている現在のノードとその先祖を示す階層リンクが表示されます。 サイト マップ データは、SiteMapDataSource を使用して他のデータ Web コントロールにバインドでき、 クラスを介してプログラムで SiteMap
アクセスできます。
Site Map フレームワークとナビゲーション コントロールの詳細な説明は、このチュートリアル シリーズの範囲を超えているので、独自のナビゲーション ユーザー インターフェイスの作成に時間を費やすのではなく、リピータ コントロールを使用してナビゲーション リンクの 2 つの深い箇条書きを表示する 、ASP.NET 2.0 のチュートリアル シリーズの「データの操作」で使用するものを借りてみましょう。 図 4 に示すように、
左側の列にリンクのTwo-Levelリストを追加する
このインターフェイスを作成するには、マスター ページの左側の列に次の宣言型マークアップを Site.master
追加します。ここで、TODO: Menu というテキストがここに表示されます。は現在存在します。
<ul>
<li>
<asp:HyperLink runat="server" ID="lnkHome" NavigateUrl="~/Default.aspx">Home</asp:HyperLink>
</li>
<asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1">
<ItemTemplate>
<li>
<asp:HyperLink ID="lnkMenuItem" runat="server"
NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
<asp:Repeater ID="submenu" runat="server" DataSource="<%#
CType(Container.DataItem, SiteMapNode).ChildNodes %>">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li>
<asp:HyperLink ID="lnkMenuItem"
runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false"/>
上記のマークアップは、 という名前 menu
の Repeater コントロールを SiteMapDataSource にバインドし、 で Web.sitemap
定義されているサイト マップ階層を返します。 SiteMapDataSource コントロールの ShowStartingNode
プロパティ は False に設定されているため、ホーム ノードの子孫からサイト マップの階層が返されます。 Repeater は、これらの各ノード (現在はメンバーシップのみ) を <li>
要素に表示します。 もう 1 つの内部 Repeater は、現在のノードの子を入れ子になった順序付けされていないリストに表示します。
図 4 は、上記のマークアップのレンダリングされた出力と、手順 2 で作成したサイト マップ構造を示しています。 Repeater は、バニラの順序なしのリスト マークアップをレンダリングします。で Styles.css
定義されているカスケード スタイル シートルールは、美しく快適なレイアウトを担当します。 上記のマークアップのしくみの詳細については、 マスター ページとサイト ナビゲーション のチュートリアルを参照してください。
図 4: ナビゲーション ユーザー インターフェイスは、入れ子になった順序なしのリストを使用してレンダリングされます (フルサイズの画像を表示する をクリックします)
階層リンク ナビゲーションの追加
左側の列のリンクの一覧に加えて、各ページに 階層リンクを表示させてみましょう。 階層リンクは、ユーザーがサイト階層内の現在の位置をすばやく表示するナビゲーション ユーザー インターフェイス要素です。 SiteMapPath コントロールは、サイト マップ フレームワークを使用してサイト マップ内の現在のページの位置を決定し、この情報に基づいて階層リンクを表示します。
具体的には、マスター ページのヘッダー<div>
要素に 要素を追加<span>
し、新しい<span>
要素の class
属性を階層リンクに設定します。 (クラスには Styles.css
階層リンク クラスのルールが含まれています)。次に、この新しい <span>
要素に SiteMapPath を追加します。
<div id="header">
<span class="title">User Account Tutorials</span><br />
<span class="breadcrumb">
<asp:SiteMapPath ID="SiteMapPath1" runat="server">
</asp:SiteMapPath>
</span>
</div>
図 5 は、 にアクセスするときの SiteMapPath の出力を ~/Membership/CreatingUserAccounts.aspx
示しています。
図 5: 階層リンク:現在のページとその先祖がサイト マップに表示されます (フルサイズの画像を表示する をクリックします)
手順 4: カスタム プリンシパルと ID ロジックを削除する
カスタム プリンシパル オブジェクトと ID オブジェクトは、認証されたユーザーに関連付けることができます。 これを実現するには、 で Global.asax
アプリケーション PostAuthenticateRequest
のイベントのイベント ハンドラーを作成します。これは、 がユーザーを認証した後 FormsAuthenticationModule
に発生します。 このイベント ハンドラーでは、 によってFormsAuthenticationModule
追加された GenericPrincipal
オブジェクトと FormsIdentity
オブジェクトを、そのチュートリアルで作成した CustomPrincipal
オブジェクトと CustomIdentity
オブジェクトに置き換えました。
カスタム プリンシパル オブジェクトと ID オブジェクトは特定のシナリオで役立ちますが、ほとんどの場合、 GenericPrincipal
オブジェクトと FormsIdentity
オブジェクトで十分です。 したがって、私はデフォルトの動作に戻る価値があると思います。 この変更を行うには、イベント ハンドラーを削除またはコメントアウト PostAuthenticateRequest
するか、ファイルを完全に Global.asax
削除します。
注意
で Global.asax
コードをコメントまたは削除したら、プロパティをインスタンスにキャストする分離コード クラスの Default.aspx's
コードを User.Identity
コメントアウトする CustomIdentity
必要があります。
手順 5: プログラムによって新しいユーザーを作成する
Membership フレームワークを使用して新しいユーザー アカウントを作成するには、 クラスの CreateUser
メソッドをMembership
使用します。 このメソッドには、ユーザー名、パスワード、およびその他のユーザー関連フィールドの入力パラメーターがあります。 呼び出し時に、新しいユーザー アカウントの作成を構成済みのメンバーシップ プロバイダーに委任し、作成したばかりのユーザー アカウントを表す オブジェクトを返MembershipUser
します。
CreateUser
メソッドには 4 つのオーバーロードがあり、それぞれが異なる数の入力パラメーターを受け入れます。
CreateUser(username, password)
CreateUser(username, password, email)
CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, MembershipCreateStatus)
CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, MembershipCreateStatus)
これら 4 つのオーバーロードは、収集される情報の量によって異なります。 たとえば、最初のオーバーロードでは新しいユーザー アカウントのユーザー名とパスワードだけが必要ですが、2 つ目のオーバーロードではユーザーのメール アドレスも必要です。
新しいユーザー アカウントの作成に必要な情報はメンバーシップ プロバイダーの構成設定によって異なるため、これらのオーバーロードが存在します。 「SQL Serverでのメンバーシップ スキーマの作成」チュートリアルでは、 でWeb.config
メンバーシップ プロバイダーの構成設定を指定することを確認しました。 表 2 には、構成設定の完全な一覧が含まれています。
このようなメンバーシップ プロバイダー構成設定の 1 つは、使用できるオーバーロードに CreateUser
影響を requiresQuestionAndAnswer
与える設定です。 が (既定値) にtrue
設定されている場合requiresQuestionAndAnswer
は、新しいユーザー アカウントを作成するときに、セキュリティの質問と回答を指定する必要があります。 この情報は、ユーザーがパスワードをリセットまたは変更する必要がある場合に後で使用されます。 具体的には、その時点でセキュリティの質問が表示され、パスワードをリセットまたは変更するために正しい回答を入力する必要があります。 したがって、 が にtrue
設定されている場合requiresQuestionAndAnswer
、最初の 2 つのCreateUser
オーバーロードのいずれかを呼び出すと、セキュリティの質問と回答がないため、例外が発生します。 現在、アプリケーションはセキュリティの質問と回答を必要とするように構成されているため、ユーザーをプログラムで作成する場合は、後者の 2 つのオーバーロードのいずれかを使用する必要があります。
メソッドを使用する方法を CreateUser
説明するために、ユーザーに名前、パスワード、電子メール、定義済みのセキュリティの質問に対する回答を求めるユーザー インターフェイスを作成しましょう。 フォルダー内の CreatingUserAccounts.aspx
ページを Membership
開き、次の Web コントロールを Content コントロールに追加します。
- という名前のテキスト ボックス
Username
- プロパティが に設定されている という名前
Password
TextMode
の TextBoxPassword
- という名前のテキスト ボックス
Email
- プロパティがクリアされた という名前
SecurityQuestion
Text
のラベル - という名前のテキスト ボックス
SecurityAnswer
- プロパティが
Text
[ユーザー アカウントの作成] に設定されているという名前CreateAccountButton
のボタン - プロパティがクリアされた という名前
CreateAccountResults
のText
Label コントロール
この時点で、画面は図 6 に示すスクリーン ショットのようになります。
図 6: さまざまな Web コントロールを に CreatingUserAccounts.aspx Page
追加します (フルサイズの画像を表示する 場合は、ここをクリックします)
SecurityQuestion
Label と SecurityAnswer
TextBox は、定義済みのセキュリティの質問を表示し、ユーザーの回答を収集することを目的としています。 セキュリティの質問と回答の両方がユーザーごとに格納されるため、各ユーザーが独自のセキュリティの質問を定義できるようにすることができます。 しかし、この例では、ユニバーサルセキュリティの質問を使用することにしました。つまり、お気に入りの色は何ですか?
この定義済みのセキュリティの質問を実装するには、 という名前 passwordQuestion
のページの分離コード クラスに定数を追加し、セキュリティの質問を割り当てます。 次にPage_Load
、イベント ハンドラーで、この定数を Label の Text
プロパティにSecurityQuestion
割り当てます。
Const passwordQuestion As String = "What is your favorite color"
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
SecurityQuestion.Text = passwordQuestion
End If
End Sub
次に、 イベントのイベント ハンドラーをCreateAccountButton'
Click
作成し、次のコードを追加します。
Protected Sub CreateAccountButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateAccountButton.Click
Dim createStatus As MembershipCreateStatus
Dim newUser As MembershipUser = _
Membership.CreateUser(Username.Text, Password.Text, _
Email.Text, passwordQuestion, _
SecurityAnswer.Text, True, _
createStatus)
Select Case createStatus
Case MembershipCreateStatus.Success
CreateAccountResults.Text = "The user account was successfully created!"
Case MembershipCreateStatus.DuplicateUserName
CreateAccountResults.Text = "There already exists a user with this username."
Case MembershipCreateStatus.DuplicateEmail
CreateAccountResults.Text = "There already exists a user with this email address."
Case MembershipCreateStatus.InvalidEmail
CreateAccountResults.Text = "There email address you provided in invalid."
Case MembershipCreateStatus.InvalidAnswer
CreateAccountResults.Text = "There security answer was invalid."
Case MembershipCreateStatus.InvalidPassword
CreateAccountResults.Text = "The password you provided is invalid. It must be seven characters long and have at least one non-alphanumeric character."
Case Else
CreateAccountResults.Text = "There was an unknown error; the user account was NOT created."
End Select
End Sub
イベント ハンドラーはClick
、 型MembershipCreateStatus
という名前createStatus
の変数を定義することから始まります。 MembershipCreateStatus
は、操作の CreateUser
状態を示す列挙です。 たとえば、ユーザー アカウントが正常に作成されると、結果 MembershipCreateStatus
のインスタンスは 値 に Success;
設定されます。一方、同じユーザー名を持つユーザーが既に存在するため操作が失敗した場合は、 の DuplicateUserName
値に設定されます。 使用する CreateUser
オーバーロードでは、 メソッドにインスタンスを MembershipCreateStatus
渡す必要があります。 このパラメーターは メソッド内 CreateUser
の適切な値に設定されており、メソッド呼び出し後にその値を調べて、ユーザー アカウントが正常に作成されたかどうかを判断できます。
を呼び出 CreateUser
した後、 ステートメント createStatus
を Select Case
使用して、 に割り当てられた値に応じて適切なメッセージを createStatus
出力します。 図 7 は、新しいユーザーが正常に作成された場合の出力を示しています。 図 8 と図 9 は、ユーザー アカウントが作成されていない場合の出力を示しています。 図 8 では、訪問者が 5 文字のパスワードを入力しました。これは、メンバーシップ プロバイダーの構成設定に示されているパスワード強度の要件を満たしていません。 図 9 では、訪問者は既存のユーザー名 (図 7 で作成されたもの) を使用してユーザー アカウントを作成しようとしています。
図 7: 新しいユーザー アカウントが正常に作成されました (フルサイズの画像を表示する場合はクリックします)
図 8: 指定されたパスワードが弱すぎるため、ユーザー アカウントが作成されない (クリックするとフルサイズの画像が表示されます)
図 9: ユーザー名が既に使用されているため、ユーザー アカウントが作成されていません (フルサイズの画像を表示する場合はクリックします)
注意
最初の 2 つの CreateUser
メソッド オーバーロードのいずれかを使用する場合、成功または失敗を判断する方法を疑問に思うかもしれません。どちらも 型 MembershipCreateStatus
のパラメーターを持つものもありません。 これらの最初の 2 つのオーバーロードは、エラーが発生した場合に例外をスローMembershipCreateUserException
します。これには、 型MembershipCreateStatus
の プロパティがStatusCode
含まれます。
いくつかのユーザー アカウントを作成した後、データベース内の テーブルと aspnet_Membership
テーブルSecurityTutorials.mdf
の内容を一覧表示して、アカウントがaspnet_Users
作成されていることを確認します。 図 10 に示すように、ページを介して Tito と Bruce という 2 人のユーザーを CreatingUserAccounts.aspx
追加しました。
図 10: メンバーシップ ユーザー ストアには Tito と Bruce の 2 人のユーザーが存在します (フルサイズの画像を表示するには、ここをクリックします)
メンバーシップ ユーザー ストアには Bruce と Tito のアカウント情報が含まれるようになりましたが、Bruce または Tito がサイトにログオンできるようにする機能はまだ実装されていません。 現在、 Login.aspx
ユーザーの資格情報は、ハードコーディングされた一連のユーザー名とパスワードのペアに対して検証されます。メンバーシップ フレームワークに対して指定された資格情報は検証 されません 。 ここでは、 テーブルと aspnet_Membership
テーブルにaspnet_Users
新しいユーザー アカウントを表示すれば十分です。 次のチュートリアル「メンバーシップ ユーザー ストアに対するユーザー資格情報の検証」では、メンバーシップ ストアに対して検証するようにログイン ページを更新します。
注意
データベースに SecurityTutorials.mdf
ユーザーが表示されない場合は、Web アプリケーションで既定のメンバーシップ プロバイダー AspNetSqlMembershipProvider
(データベースをユーザー ストアとして使用) が使用 ASPNETDB.mdf
されていることが原因である可能性があります。 これが問題であるかどうかを判断するには、ソリューション エクスプローラーの [更新] ボタンをクリックします。 という名前 ASPNETDB.mdf
のデータベースがフォルダーに App_Data
追加されている場合は、これが問題です。 メンバーシップ プロバイダーを適切に構成する方法については、SQL Serverチュートリアルの「メンバーシップ スキーマの作成」の手順 4 に戻ります。
ほとんどのユーザー アカウントの作成シナリオでは、訪問者にユーザー名、パスワード、電子メール、その他の重要な情報を入力するためのインターフェイスが表示され、その時点で新しいアカウントが作成されます。 この手順では、このようなインターフェイスを手動で構築し、 メソッドを使用 Membership.CreateUser
して、ユーザーの入力に基づいて新しいユーザー アカウントをプログラムで追加する方法を確認しました。 ただし、このコードでは、新しいユーザー アカウントを作成しました。 作成したユーザー アカウントでサイトにユーザーをログインさせる、確認メールをユーザーに送信するなどのフォローアップ アクションは実行されませんでした。 これらの追加の手順では、Button のイベント ハンドラーに追加の Click
コードが必要になります。
ASP.NET には、ユーザー アカウント作成プロセスを処理するように設計された CreateUserWizard コントロールが付属しています。このコントロールは、新しいユーザー アカウントを作成するためのユーザー インターフェイスのレンダリングから、Membership フレームワークでのアカウントの作成、アカウント作成後のタスク (確認メールの送信や、作成したユーザーのサイトへのログ記録など) の実行までを行います。 CreateUserWizard コントロールの使用は、ツールボックスからページに CreateUserWizard コントロールをドラッグし、いくつかのプロパティを設定するのと同じくらい簡単です。 ほとんどの場合、1 行のコードを記述する必要はありません。 この便利なコントロールについては、手順 6 で詳しく説明します。
新しいユーザー アカウントが一般的な [アカウントの作成] Web ページでのみ作成される場合、CreateUserWizard コントロールがニーズを満たす可能性が高く、メソッドを使用 CreateUser
するコードを記述する必要はほとんどありません。 ただし、 メソッドは、 CreateUser
高度にカスタマイズされたアカウントの作成ユーザー エクスペリエンスが必要なシナリオや、別のインターフェイスを使用してプログラムで新しいユーザー アカウントを作成する必要があるシナリオで便利です。 たとえば、ユーザーが他のアプリケーションからのユーザー情報を含む XML ファイルをアップロードできるようにするページがあるとします。 ページは、アップロードされた XML ファイルの内容を解析し、 メソッドを呼び出して XML で表される各ユーザーの新しいアカウントを CreateUser
作成する場合があります。
手順 6: CreateUserWizard コントロールを使用して新しいユーザーを作成する
ASP.NET には、多数のログイン Web コントロールが付属しています。 これらのコントロールは、多くの一般的なユーザー アカウントとログイン関連のシナリオで役立つ。 CreateUserWizard コントロールは、メンバーシップ フレームワークに新しいユーザー アカウントを追加するためのユーザー インターフェイスを提示するように設計されたこのようなコントロールの 1 つです。
他のログイン関連の Web コントロールの多くと同様に、CreateUserWizard は 1 行のコードを記述せずに使用できます。 メンバーシップ プロバイダーの構成設定に基づいてユーザー インターフェイスを直感的に提供し、ユーザーが必要な情報を Membership
入力して [ユーザーの作成] ボタンをクリックした後、クラスの CreateUser
メソッドを内部的に呼び出します。 CreateUserWizard コントロールは非常にカスタマイズ可能です。 アカウント作成プロセスのさまざまな段階で発生するイベントのホストがあります。 必要に応じてイベント ハンドラーを作成して、アカウント作成ワークフローにカスタム ロジックを挿入できます。 さらに、CreateUserWizard の外観は非常に柔軟です。 既定のインターフェイスの外観を定義するプロパティは多数あります。必要に応じて、コントロールをテンプレートに変換することも、追加のユーザー登録手順を追加することもできます。
まず、CreateUserWizard コントロールの既定のインターフェイスと動作を使用して見てみましょう。 次に、コントロールのプロパティとイベントを使用して外観をカスタマイズする方法について説明します。
CreateUserWizard の既定のインターフェイスと動作の確認
フォルダー内の CreatingUserAccounts.aspx
ページに Membership
戻り、デザイン モードまたは分割モードに切り替えて、ページの上部に CreateUserWizard コントロールを追加します。 CreateUserWizard コントロールは、ツールボックスの [ログイン コントロール] セクションの下に表示されます。 コントロールを追加した後、そのプロパティを ID
に RegisterUser
設定します。 図 11 のスクリーン ショットに示すように、CreateUserWizard は、新しいユーザーのユーザー名、パスワード、メール アドレス、セキュリティの質問と回答のテキスト ボックスを含むインターフェイスをレンダリングします。
図 11: CreateUserWizard コントロールは、汎用のユーザー インターフェイスの作成をレンダリングします (フルサイズの画像を表示するをクリックします)
CreateUserWizard コントロールによって生成された既定のユーザー インターフェイスと、手順 5 で作成したインターフェイスを比較してみましょう。 まず、CreateUserWizard コントロールを使用すると、訪問者はセキュリティの質問と回答の両方を指定できます。一方、手動で作成したインターフェイスでは事前に定義されたセキュリティの質問が使用されています。 CreateUserWizard コントロールのインターフェイスには検証コントロールも含まれていますが、インターフェイスのフォーム フィールドに検証を実装する必要がありました。 また、CreateUserWizard コントロール インターフェイスには、[パスワードの確認] ボックスが含まれています ([パスワード] ボックスと [パスワードの比較] テキスト ボックスに入力されたテキストが等しいことを確認するための CompareValidator と共に)。
興味深いのは、CreateUserWizard コントロールが、ユーザー インターフェイスをレンダリングするときにメンバーシップ プロバイダーの構成設定を参照することです。 たとえば、セキュリティの質問と回答のテキスト ボックスは、 が True に設定されている場合 requiresQuestionAndAnswer
にのみ表示されます。 同様に、CreateUserWizard は自動的に RegularExpressionValidator コントロールを追加して、パスワード強度の要件が満たされていることを確認し、、および の構成設定にminRequiredPasswordLength
minRequiredNonalphanumericCharacters
基づいて、その ErrorMessage
プロパティと ValidationExpression
プロパティをpasswordStrengthRegularExpression
設定します。
CreateUserWizard コントロールの名前が示すように、 Wizard コントロールから派生します。 ウィザード コントロールは、マルチステップ タスクを完了するためのインターフェイスを提供するように設計されています。 Wizard コントロールには、任意の数の WizardSteps
があり、それぞれが、そのステップの HTML コントロールと Web コントロールを定義するテンプレートです。 ウィザード コントロールは、最初に最初 WizardStep
の をナビゲーション コントロールと共に表示します。このコントロールを使用すると、ユーザーは 1 つのステップから次のステップに進んだり、前の手順に戻ったりできます。
図 11 の宣言型マークアップに示すように、CreateUserWizard コントロールの既定のインターフェイスには、次の 2 つの WizardStep
インターフェイスが含まれています。
CreateUserWizardStep
? は、 インターフェイスをレンダリングして、新しいユーザー アカウントを作成するための情報を収集します。 これは図 11 に示す手順です。CompleteWizardStep
? は、アカウントが正常に作成されたことを示すメッセージを表示します。
CreateUserWizard の外観と動作は、これらの手順のいずれかをテンプレートに変換するか、独自 WizardStep
の を追加することによって変更できます。 登録インターフェイスへの を WizardStep
追加する方法については、 追加のユーザー情報の格納 に関するチュートリアルを参照してください。
CreateUserWizard コントロールの動作を見てみましょう。 ブラウザーから CreatingUserAccounts.aspx
ページにアクセスします。 まず、CreateUserWizard のインターフェイスに無効な値を入力します。 パスワード強度の要件に準拠していないパスワードを入力するか、[ユーザー名] ボックスを空のままにします。 CreateUserWizard に適切なエラー メッセージが表示されます。 図 12 は、十分に強力なパスワードを使用してユーザーを作成しようとしたときの出力を示しています。
図 12: CreateUserWizard によって検証コントロールが自動的に挿入される (フルサイズの画像を表示する場合はクリックします)
次に、CreateUserWizard に適切な値を入力し、[ユーザーの作成] ボタンをクリックします。 必要なフィールドが入力されていて、パスワードの強度が十分であると仮定すると、CreateUserWizard はメンバーシップ フレームワークを使用して新しいユーザー アカウントを作成し、 のインターフェイスを CompleteWizardStep
表示します (図 13 を参照)。 CreateUserWizard は、手順 5 で行ったように、バックグラウンドで メソッドを呼び出します Membership.CreateUser
。
図 13: 新しいユーザー アカウントが正常に作成されました (クリックするとフルサイズの画像が表示されます)
注意
図 13 に示すように、 CompleteWizardStep
のインターフェイスには [続行] ボタンが含まれています。 ただし、この時点でクリックするとポストバックが実行され、訪問者は同じページに残ります。 [CreateUserWizard の外観とそのプロパティによる動作のカスタマイズ] セクションでは、このボタンで訪問者を (または他のページ) に送信する Default.aspx
方法を確認します。
新しいユーザー アカウントを作成したら、Visual Studio に戻り、図 10 のように テーブルと aspnet_Membership
テーブルを調べてaspnet_Users
、アカウントが正常に作成されたことを確認します。
CreateUserWizard のプロパティを使用した動作と外観のカスタマイズ
CreateUserWizard は、プロパティ WizardStep
、s、およびイベント ハンドラーを使用して、さまざまな方法でカスタマイズできます。 このセクションでは、コントロールのプロパティを使用してコントロールの外観をカスタマイズする方法について説明します。次のセクションでは、イベント ハンドラーを使用してコントロールの動作を拡張する方法について説明します。
CreateUserWizard コントロールの既定のユーザー インターフェイスに表示されるほぼすべてのテキストは、多数のプロパティを使用してカスタマイズできます。 たとえば、テキスト ボックスの左側に表示されるユーザー名、パスワード、パスワードの確認、パスワードの確認、電子メール、セキュリティの質問、およびセキュリティ回答の各ラベルは、それぞれ、PasswordLabelText
EmailLabelText
ConfirmPasswordLabelText
QuestionLabelText
および AnswerLabelText
プロパティでUserNameLabelText
カスタマイズできます。 同様に、 と CompleteWizardStep
の [ユーザーの作成] ボタンと [続行] ボタンCreateUserWizardStep
のテキストを指定するためのプロパティと、ボタンが Buttons、LinkButtons、または ImageButtons としてレンダリングされる場合は、プロパティがあります。
色、罫線、フォント、およびその他のビジュアル要素は、スタイル プロパティのホストを通じて構成できます。 CreateUserWizard コントロール自体には、共通の Web コントロール スタイル プロパティ BackColor
(、 BorderStyle
、 CssClass
、 Font
、 など) があり、CreateUserWizard のインターフェイスの特定のセクションの外観を定義するためのスタイル プロパティがいくつかあります。 たとえば、 プロパティは TextBoxStyle
内CreateUserWizardStep
のテキスト ボックスのスタイルを定義しTitleTextStyle
、 プロパティはタイトルのスタイルを定義します (新しいアカウントにサインアップします)。
外観に関連するプロパティに加えて、CreateUserWizard コントロールの動作に影響を与えるプロパティがいくつかあります。 プロパティを DisplayCancelButton
True に設定すると、[ユーザーの作成] ボタンの横に [キャンセル] ボタンが表示されます (既定値は False)。 [キャンセル] ボタンを表示する場合は、[キャンセル] をクリックした後にユーザーが送信するページを指定する プロパティも必ず設定CancelDestinationPageUrl
してください。 前のセクションで説明したように、 の インターフェイスの CompleteWizardStep
[続行] ボタンをクリックするとポストバックが発生しますが、訪問者は同じページに残ります。 [続行] ボタンをクリックした後に訪問者を他のページに送信するには、 プロパティに ContinueDestinationPageUrl
URL を指定するだけです。
CreateUserWizard コントロールを RegisterUser
更新して、[キャンセル] ボタンを表示し、[キャンセル] ボタンまたは [続行] ボタンがクリックされたときに訪問者を Default.aspx
に送信しましょう。 これを実現するには、 プロパティを DisplayCancelButton
True に設定し、 プロパティと ContinueDestinationPageUrl
プロパティのCancelDestinationPageUrl
両方を ~/Default.aspx に設定します。 図 14 は、ブラウザーで表示した場合の更新された CreateUserWizard を示しています。
図 14: キャンセル CreateUserWizardStep
ボタンを含む (フルサイズの画像を表示する場合をクリックします)
訪問者がユーザー名、パスワード、電子メール アドレス、セキュリティの質問と回答を入力し、[ユーザーの作成] をクリックすると、新しいユーザー アカウントが作成され、その新しく作成されたユーザーとして訪問者がログインします。 ページにアクセスするユーザーが自分で新しいアカウントを作成していると仮定すると、これが望ましい動作である可能性があります。 ただし、管理者に新しいユーザー アカウントの追加を許可することもできます。 その場合、ユーザー アカウントは作成されますが、管理者は (新しく作成されたアカウントとしてではなく) 管理者としてログインしたままになります。 この動作は、Boolean LoginCreatedUser
プロパティを使用して変更できます。
メンバーシップ フレームワークのユーザー アカウントには、承認されたフラグが含まれています。承認されていないユーザーは、サイトにログインできません。 既定では、新しく作成されたアカウントは承認済みとしてマークされ、ユーザーはすぐにサイトにログインできます。 ただし、新しいユーザー アカウントが未承認としてマークされている可能性があります。 管理者がログインする前に、新しいユーザーを手動で承認する必要がある場合があります。または、ユーザーにログオンを許可する前に、サインアップ時に入力された電子メール アドレスが有効であることを確認したい場合があります。 どのような場合でも、CreateUserWizard コントロール DisableCreatedUser
のプロパティ を True (既定値は False) に設定することで、新しく作成したユーザー アカウントを未承認としてマークできます。
メモのその他の動作関連のプロパティには、 と がありますAutoGeneratePassword
MailDefinition
。 プロパティが AutoGeneratePassword
True に設定されている場合、 CreateUserWizardStep
には [パスワード] ボックスと [パスワードの確認] テキスト ボックスは表示されません。代わりに、新しく作成されたユーザーのパスワードは、 クラスの GeneratePassword
メソッドをMembership
使用して自動的に生成されます。 メソッドは GeneratePassword
、構成されたパスワード強度要件を満たすのに十分な数の英数字以外の文字を使用して、指定した長さのパスワードを構築します。
プロパティはMailDefinition
、アカウント作成プロセス中に指定されたメール アドレスにメールを送信する場合に便利です。 プロパティには MailDefinition
、構築された電子メール メッセージに関する情報を定義するための一連のサブプロパティが含まれています。 これらのサブプロパティには、、Priority
、、IsBodyHtml
、CC
From
、 などのSubject
オプションがBodyFileName
含まれます。 プロパティはBodyFileName
、電子メール メッセージの本文を含むテキストまたは HTML ファイルを指します。 本文では、 と <%Password%>
という 2 つの定義済みのプレースホルダーが<%UserName%>
サポートされています。 これらのプレースホルダーは、ファイル内に存在する BodyFileName
場合は、作成したばかりのユーザーの名前とパスワードに置き換えられます。
注意
コントロールの MailDefinition
プロパティはCreateUserWizard
、新しいアカウントの作成時に送信される電子メール メッセージに関する詳細を指定するだけです。 電子メール メッセージの実際の送信方法 (つまり、SMTP サーバーまたはメール ドロップ ディレクトリが使用されているかどうか、認証情報など) に関する詳細は含まれません。 これらの低レベルの詳細は、 の セクションWeb.config
で定義する<system.net>
必要があります。 これらの構成設定の詳細と、ASP.NET 2.0 からの一般的なメール送信の詳細については、「SystemNetMail.com と自分の記事の FAQ(ASP.NET2.0 でのEmailの送信」を参照してください。
イベント ハンドラーを使用した CreateUserWizard の動作の拡張
CreateUserWizard コントロールは、ワークフロー中に多数のイベントを発生させます。 たとえば、訪問者がユーザー名、パスワード、およびその他の関連情報を入力し、[ユーザーの作成] ボタンをクリックすると、CreateUserWizard コントロールによってイベントがCreatingUser
発生します。 作成プロセス中に問題が発生した CreateUserError
場合は、イベント が発生します。ただし、ユーザーが正常に作成されると、 CreatedUser
イベント が発生します。 発生する CreateUserWizard コントロール イベントが追加されていますが、これらは 3 つの最もドイツ語的なイベントです。
特定のシナリオでは、CreateUserWizard ワークフローを利用できます。これを行うには、適切なイベントのイベント ハンドラーを作成します。 これを説明するために、CreateUserWizard コントロールを RegisterUser
拡張して、ユーザー名とパスワードにカスタム検証を含めましょう。 特に、CreateUserWizard を拡張して、ユーザー名に先頭または末尾のスペースを含めず、ユーザー名をパスワードのどこにも表示できないようにしましょう。 つまり、誰かが "Scott" のようなユーザー名を作成したり、Scott や Scott.1234 などのユーザー名とパスワードの組み合わせを行ったりできないようにしたいと考えています。
これを実現するには、追加の検証チェックを実行するイベントの CreatingUser
イベント ハンドラーを作成します。 指定されたデータが無効な場合は、作成プロセスをキャンセルする必要があります。 また、ラベル Web コントロールをページに追加して、ユーザー名またはパスワードが無効であることを説明するメッセージを表示する必要があります。 まず、CreateUserWizard コントロールの下に Label コントロールを追加し、そのプロパティを ID
に InvalidUserNameOrPasswordMessage
設定し、その ForeColor
プロパティを に設定します Red
。 プロパティをクリアし、その Text
プロパティと Visible
プロパティを EnableViewState
False に設定します。
<asp:Label runat="server"" id="InvalidUserNameOrPasswordMessage"
Visible="false" ForeColor="Red" EnableViewState="false">
</asp:Label>
次に、CreateUserWizard コントロールのイベントのイベント ハンドラーを CreatingUser
作成します。 イベント ハンドラーを作成するには、Designerでコントロールを選択し、プロパティ ウィンドウに移動します。 そこから稲妻アイコンをクリックし、適切なイベントをダブルクリックしてイベント ハンドラーを作成します。
CreatingUser
イベント ハンドラーに次のコードを追加します。
Protected Sub RegisterUser_CreatingUser(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LoginCancelEventArgs) Handles RegisterUser.CreatingUser
Dim trimmedUserName As String = RegisterUser.UserName.Trim()
If RegisterUser.UserName.Length <> trimmedUserName.Length Then
' Show the error message
InvalidUserNameOrPasswordMessage.Text = "The username cannot contain leading or trailing spaces."
InvalidUserNameOrPasswordMessage.Visible = True
' Cancel the create user workflow
e.Cancel = True
Else
' Username is valid, make sure that the password does not contain the username
If RegisterUser.Password.IndexOf(RegisterUser.UserName, StringComparison.OrdinalIgnoreCase) >= 0 Then
' Show the error message
InvalidUserNameOrPasswordMessage.Text = "The username may not appear anywhere in the password."
InvalidUserNameOrPasswordMessage.Visible = True
' Cancel the create user workflow
e.Cancel = True
End If
End If
End Sub
CreateUserWizard コントロールに入力したユーザー名とパスワードは、それぞれ プロパティ UserName
と Password
プロパティを通じて使用できます。 上記のイベント ハンドラーでは、これらのプロパティを使用して、指定されたユーザー名に先頭または末尾のスペースが含まれているかどうか、およびユーザー名がパスワード内で見つかったかどうかを判断します。 これらの条件のいずれかが満たされた場合、エラー メッセージが Label に InvalidUserNameOrPasswordMessage
表示され、イベント ハンドラーの e.Cancel
プロパティが に True
設定されます。 が にTrue
設定されている場合e.Cancel
、CreateUserWizard はワークフローをショートサーキットし、ユーザー アカウントの作成プロセスを実質的に取り消します。
図 15 は、ユーザーが先頭に CreatingUserAccounts.aspx
スペースを含むユーザー名を入力したときのスクリーン ショットを示しています。
図 15: 先頭または末尾のスペースを持つユーザー名は許可されていません (フルサイズの画像を表示するをクリックします)
まとめ
クラスの CreateUser
メソッドはMembership
、Membership フレームワークに新しいユーザー アカウントを作成します。 これは、構成されたメンバーシップ プロバイダーへの呼び出しを委任することによって行われます。 のSqlMembershipProvider
場合、 メソッドは CreateUser
および aspnet_Membership
データベース テーブルにレコードをaspnet_Users
追加します。
(手順 5 で説明したように) 新しいユーザー アカウントはプログラムで作成できますが、より高速で簡単な方法は CreateUserWizard コントロールを使用することです。 このコントロールは、ユーザー情報を収集し、メンバーシップ フレームワークで新しいユーザーを作成するためのマルチステップ ユーザー インターフェイスをレンダリングします。 このコントロールの下では、手順 5 で確認したのと同じ Membership.CreateUser
方法が使用されますが、コントロールはユーザー インターフェイス、検証コントロールを作成し、コードのなめしを記述しなくてもユーザー アカウント作成エラーに応答します。
この時点で、新しいユーザー アカウントを作成する機能が用意されています。 ただし、ログイン ページでは、2 番目のチュートリアルで指定したハードコーディングされた資格情報に対して検証が行われます。 次の チュートリアル では、メンバーシップ フレームワークに対してユーザーが指定した資格情報を検証するように更新 Login.aspx
します。
プログラミングに満足!
もっと読む
このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。
CreateUser
技術ドキュメント- CreateUserWizard コントロールの概要
- サイト マップ プロバイダーSystem-Basedファイルの作成
- ASP.NET 2.0 ウィザード コントロールを使用したステップ バイ ステップ ユーザー インターフェイスの作成
- ASP.NET 2.0 のサイト ナビゲーションの確認
- マスター ページとサイト ナビゲーション
- 待っていた SQL サイト マップ プロバイダー
著者について
複数の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 Scott は、 または mitchell@4guysfromrolla.com のブログから http://ScottOnWriting.NETアクセスできます。
特別な感謝
このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリードレビュー担当者はテレサ・マーフィーでした。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 に mitchell@4GuysFromRolla.com行をドロップしてください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示