メンバーシップ ユーザー ストアに対してユーザー資格情報を確認する (VB)

作成者: Scott Mitchell

注意

この記事が作成されて以来、ASP.NET メンバーシップ プロバイダーは 、ASP.NET ID に置き換えられました。 この記事の執筆時点で取り上げられたメンバーシップ プロバイダーではなく 、ASP.NET ID プラットフォームを使用するようにアプリを更新することを強くお勧めします。 ASP.NET ID には、ASP.NET メンバーシップ システムに比して、次のような多くの利点があります。

  • パフォーマンスの向上
  • 拡張性とテスト容易性の向上
  • OAuth、OpenID Connect、および 2 要素認証のサポート
  • クレームベースの ID のサポート
  • ASP.Net Core との相互運用性の向上

コードのダウンロード または PDF のダウンロード

このチュートリアルでは、プログラムによる方法とログイン コントロールの両方を使用して、メンバーシップ ユーザー ストアに対してユーザーの資格情報を検証する方法について説明します。 また、ログイン コントロールの外観と動作をカスタマイズする方法についても説明します。

はじめに

前の チュートリアル では、メンバーシップ フレームワークで新しいユーザー アカウントを作成する方法について説明しました。 まず、クラスCreateUserの メソッドを使用してMembershipプログラムでユーザー アカウントを作成し、CreateUserWizard Web コントロールを使用して調べました。 ただし、現在、ログイン ページでは、ユーザー名とパスワードのペアのハードコーディングされたリストに対して、指定された資格情報が検証されます。 メンバーシップ フレームワークのユーザー ストアに対して資格情報を検証するように、ログイン ページのロジックを更新する必要があります。

ユーザー アカウントの作成と同様に、資格情報はプログラムまたは宣言によって検証できます。 Membership API には、ユーザー ストアに対してユーザーの資格情報をプログラムで検証するためのメソッドが含まれています。 ASP.NET は Login Web コントロールに付属しており、ユーザー名とパスワードのテキスト ボックスとログインボタンを含むユーザー インターフェイスがレンダリングされます。

このチュートリアルでは、プログラムによる方法とログイン コントロールの両方を使用して、メンバーシップ ユーザー ストアに対してユーザーの資格情報を検証する方法について説明します。 また、ログイン コントロールの外観と動作をカスタマイズする方法についても説明します。 それでは作業を始めましょう。

手順 1: メンバーシップ ユーザー ストアに対する資格情報の検証

フォーム認証を使用する Web サイトの場合、ユーザーはログイン ページにアクセスし、資格情報を入力して Web サイトにログオンします。 これらの資格情報は、ユーザー ストアと比較されます。 有効な場合、ユーザーにはフォーム認証チケットが付与されます。これは、訪問者の ID と信頼性を示すセキュリティ トークンです。

Membership フレームワークに対してユーザーを検証するには、 クラスの ValidateUser メソッドMembership使用します。 メソッドはValidateUser、 と passwordusername 2 つの入力パラメーターを受け取り、資格情報が有効かどうかを示すブール値を返します。 前の CreateUser チュートリアルで確認したメソッドと同様に、メソッドは ValidateUser 実際の検証を構成済みのメンバーシップ プロバイダーに委任します。

SqlMembershipProvider 、ストアド プロシージャを介して指定されたユーザーのパスワードを取得することで、指定された資格情報を aspnet_Membership_GetPasswordWithFormat 検証します。 には、 SqlMembershipProvider クリア、暗号化、ハッシュの 3 つの形式のいずれかを使用して、ユーザーのパスワードが格納されていることを思い出してください。 ストアド プロシージャは aspnet_Membership_GetPasswordWithFormat 、未加工の形式でパスワードを返します。 暗号化またはハッシュされたパスワードの場合、 は SqlMembershipProvider メソッドにValidateUser渡された値を同等の暗号化またはハッシュ状態に変換passwordし、データベースから返されたものと比較します。 データベースに格納されているパスワードが、ユーザーが入力した書式設定されたパスワードと一致する場合、資格情報は有効です。

メンバーシップ フレームワークのユーザー ストアに対して指定された資格情報を検証するように、ログイン ページ (~/Login.aspx) を更新しましょう。 このログイン ページは、「フォーム認証の概要」チュートリアルに戻り、ユーザー名とパスワード用の 2 つの TextBoxes、Remember Me チェックボックス、および Login ボタンを含むインターフェイスを作成しました (図 1 を参照)。 コードは、入力された資格情報を、ユーザー名とパスワードのペア (Scott/password、Jisun/password、Sam/password) のハードコーディングされたリストに対して検証します。

ログイン ページのインターフェイスには、2 つのテキスト ボックス、CheckBoxList、およびボタンが含まれています

図 1: ログイン ページのインターフェイスには、2 つのテキスト ボックス、CheckBoxList、およびボタンが含まれています (フルサイズの画像を表示するをクリックします)。

ログイン ページのユーザー インターフェイスは変更されませんが、Login ボタンの Click イベント ハンドラーを、Membership Framework ユーザー ストアに対してユーザーを検証するコードに置き換える必要があります。 イベント ハンドラーを更新して、コードが次のように表示されるようにします。

Protected Sub LoginButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LoginButton.Click

 ' Validate the user against the Membership framework user store
 If Membership.ValidateUser(UserName.Text, Password.Text) Then
 ' Log the user into the site
 FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked)
 End If
    
 ' If we reach here, the user's credentials were invalid
 InvalidCredentialsMessage.Visible = True
End Sub

このコードは非常に単純です。 まず、 メソッドを Membership.ValidateUser 呼び出し、指定されたユーザー名とパスワードを渡します。 そのメソッドが True を返す場合、ユーザーはクラスの RedirectFromLoginPage メソッドを FormsAuthentication 使用してサイトにサインインします。 (以下で説明したように、 フォーム認証の概要 チュートリアルでは FormsAuthentication.RedirectFromLoginPage 、フォーム認証チケットを作成し、ユーザーを適切なページにリダイレクトします)。ただし、資格情報が無効な場合は、 InvalidCredentialsMessage ラベルが表示され、ユーザー名またはパスワードが正しくなかったことをユーザーに通知します。

これですべて完了です。

ログイン ページが期待どおりに動作することをテストするには、前のチュートリアルで作成したいずれかのユーザー アカウントでログインを試みます。 または、まだアカウントを作成していない場合は、ページからアカウントを ~/Membership/CreatingUserAccounts.aspx 作成します。

注意

ユーザーが自分の資格情報を入力してログイン ページ フォームを送信すると、パスワードを含む資格情報がインターネット経由で プレーン テキストで Web サーバーに送信されます。 つまり、ネットワーク トラフィックをスニッフィングするすべてのハッカーは、ユーザー名とパスワードを確認できます。 これを防ぐには、 Secure Socket Layers (SSL) を使用してネットワーク トラフィックを暗号化することが不可欠です。 これにより、資格情報 (およびページ全体の HTML マークアップ) が、ブラウザーを離れた時点から Web サーバーによって受信されるまで暗号化されます。

メンバーシップ フレームワークが無効なログイン試行を処理する方法

訪問者がログイン ページに到達し、資格情報を送信すると、ブラウザーはログイン ページに HTTP 要求を行います。 資格情報が有効な場合、HTTP 応答には Cookie に認証チケットが含まれます。 したがって、サイトに侵入しようとするハッカーは、有効なユーザー名とパスワードを推測してログイン ページに HTTP 要求を完全に送信するプログラムを作成する可能性があります。 パスワードの推測が正しい場合、ログイン ページは認証チケット Cookie を返します。その時点で、プログラムは有効なユーザー名とパスワードのペアに遭遇したことを認識します。 ブルート フォースによって、このようなプログラムは、特にパスワードが弱い場合に、ユーザーのパスワードにつまずく可能性があります。

このようなブルート フォース攻撃を防ぐために、メンバーシップ フレームワークは、一定の時間内にログイン試行が失敗した回数がある場合に、ユーザーをロックアウトします。 正確なパラメーターは、次の 2 つのメンバーシップ プロバイダー構成設定を使用して構成できます。

  • maxInvalidPasswordAttempts - アカウントがロックアウトされるまでの期間内に、ユーザーに対して許可される無効なパスワード試行回数を指定します。既定値は 5 です。
  • passwordAttemptWindow - 指定した数の無効なログイン試行によってアカウントがロックアウトされる期間を分単位で示します。既定値は 10 です。

ユーザーがロックアウトされている場合、管理者が自分のアカウントのロックを解除するまでログインできません。 ユーザーがロックアウトされると、有効な資格情報が ValidateUser 指定されている場合でも、 メソッドは 常に を返 Falseします。 この動作により、ハッカーがブルート フォースメソッドを使用してサイトに侵入する可能性は低くなりますが、パスワードを忘れた、または誤って Caps Lock がオンになっている、または入力日が悪い有効なユーザーがロックアウトされる可能性があります。

残念ながら、ユーザー アカウントのロックを解除するための組み込みツールはありません。 アカウントのロックを解除するには、データベースを直接変更するか、適切なユーザー アカウントのテーブル内のaspnet_Membershipフィールドを変更IsLockedOutするか、ロック解除するオプションを含むロックアウトされたアカウントを一覧表示する Web ベースのインターフェイスを作成します。 今後のチュートリアルでは、一般的なユーザー アカウントとロール関連のタスクを実行するための管理インターフェイスの作成について説明します。

注意

メソッドの ValidateUser 欠点の 1 つは、指定された資格情報が無効な場合、その理由に関する説明が提供されないことです。 ユーザー ストアに一致するユーザー名とパスワードのペアがないため、またはユーザーがまだ承認されていないか、ユーザーがロックアウトされているため、資格情報が無効である可能性があります。手順 4 では、ログイン試行が失敗したときに、より詳細なメッセージをユーザーに表示する方法について説明します。

手順 2: ログイン Web コントロールを使用して資格情報を収集する

Login Web コントロールは、フォーム認証の概要に関するチュートリアルで作成したのと非常によく似た既定のユーザー インターフェイスをレンダリングします。 ログイン コントロールを使用すると、訪問者の資格情報を収集するためにインターフェイスを作成する必要がある作業が節約されます。 さらに、Login コントロールは自動的にユーザーにサインインするため (送信された資格情報が有効であると仮定して)、コードを記述する必要ができなくなります。

を更新 Login.aspxし、手動で作成したインターフェイスとコードを Login コントロールに置き換えます。 まず、 の既存のマークアップとコードを Login.aspx削除します。 完全に削除するか、単にコメントアウトすることができます。宣言型マークアップをコメントアウトするには、 と --%> の区切り記号で<%--囲みます。 これらの区切り記号は手動で入力するか、図 2 に示すように、コメントアウトするテキストを選択してから、ツール バーの [選択した行をコメントアウトする] アイコンをクリックします。 同様に、[選択した行をコメントアウトする] アイコンを使用して、分離コード クラスで選択したコードをコメントアウトできます。

Login.aspx で既存の宣言型マークアップとソース コードをコメント アウトする

図 2: Login.aspx の既存の宣言型マークアップとソース コードをコメントアウトする (フルサイズの画像を表示する をクリックします)

注意

Visual Studio 2005 で宣言型マークアップを表示する場合、[選択した行をコメントアウトする] アイコンは使用できません。 Visual Studio 2008 を使用していない場合は、 と --%> の区切り記号を手動で追加<%--する必要があります。

次に、 の [ツールボックス] からページに Login コントロールをドラッグし、そのプロパティを IDmyLogin設定します。 この時点で、画面は図 3 のようになります。 ログイン コントロールの既定のインターフェイスには、ユーザー名とパスワードの TextBox コントロール、次回の CheckBox の記憶、ログイン ボタンが含まれていることに注意してください。 2 つの TextBox のコントロールもあります RequiredFieldValidator

ページにログイン コントロールを追加する

図 3: ページにログイン コントロールを追加する (クリックするとフルサイズの画像が表示されます)

完了です。 ログイン コントロールの [ログイン] ボタンをクリックすると、ポストバックが発生し、Login コントロールによって メソッドが呼び出 Membership.ValidateUser され、入力したユーザー名とパスワードが渡されます。 資格情報が無効な場合は、ログイン コントロールにそのようなメッセージが表示されます。 ただし、資格情報が有効な場合は、Login コントロールによってフォーム認証チケットが作成され、ユーザーが適切なページにリダイレクトされます。

Login コントロールは、4 つの要素を使用して、ログインが成功したときにユーザーを リダイレクトするための適切なページを決定します。

  • Login コントロールが、フォーム認証構成の 設定で定義された loginUrl ログイン ページ上にあるかどうか。この設定の既定値は Login.aspx
  • querystring パラメーターの ReturnUrl 存在
  • Login コントロールの プロパティのDestinationUrl
  • defaultUrlフォーム認証構成設定で指定された値。この設定の既定値は Default.aspx です。

図 4 は、Login コントロールがこれら 4 つのパラメーターを使用して適切なページ決定に到達する方法を示しています。

Login コントロールは、4 つのパラメーターを使用して、適切なページ決定に到達します。

図 4: ページにログイン コントロールを追加する (クリックするとフルサイズの画像が表示されます)

ブラウザーからサイトにアクセスし、Membership フレームワークで既存のユーザーとしてログインすることで、ログイン コントロールをテストします。

ログイン コントロールのレンダリング されたインターフェイスは、高度に構成可能です。 外観に影響を与えるプロパティは多数あります。さらに、Login コントロールをテンプレートに変換して、ユーザー インターフェイス要素のレイアウトを正確に制御できます。 この手順の残りの部分では、外観とレイアウトをカスタマイズする方法について説明します。

ログイン コントロールの外観のカスタマイズ

Login コントロールの既定のプロパティ設定では、ユーザー インターフェイスに、ユーザー名とパスワードの入力、次回の CheckBox の記憶、および [ログイン] ボタンのタイトル ( [ログイン])、TextBox コントロール、および Label コントロールが表示されます。 これらの要素の外観はすべて、Login コントロールの多数のプロパティを使用して構成できます。 さらに、新しいユーザー アカウントを作成するためのページへのリンクなど、追加のユーザー インターフェイス要素を追加するには、プロパティを 1 つまたは 2 つ設定します。

ログイン コントロールの外観を少し待ちましょう。 ページの Login.aspx 上部に Login というテキストが既に表示されているため、Login コントロールのタイトルは余分です。 そのため、Login コントロールのタイトルをTitleText削除するには、プロパティの値をクリアします。

2 つの TextBox コントロールの左側にある [ユーザー名: ] と [パスワード: ラベル] は、 プロパティと PasswordLabelText プロパティを使用してUserNameLabelTextカスタマイズできます。 [ユーザー名: ラベル] を [ユーザー名: ] に変更しましょう。 Label スタイルと TextBox スタイルは、 プロパティと TextBoxStyle プロパティでそれぞれ構成できますLabelStyle

次回の CheckBox の Text プロパティは Login コントロールの プロパティを使用して設定でき、既定のRememberMeTextチェック状態は プロパティ (既定値は False) を使用してRememberMeSet構成できます。 次に CheckBox が RememberMeSet 既定でチェックされるように、プロパティを True に設定します。

Login コントロールには、ユーザー インターフェイス コントロールのレイアウトを調整するための 2 つのプロパティが用意されています。 プロパティはTextLayout、対応する TextBoxes (既定値) の左側に Username: ラベルと Password: Labels が表示されるか、その上に表示されるかを示します。 プロパティはOrientation、ユーザー名とパスワードの入力が垂直方向 (もう 1 つ上) または水平方向のどちらに配置されているかを示します。 この 2 つのプロパティは既定値のままにしておきますが、結果として得られる効果を確認するには、これら 2 つのプロパティを既定値以外に設定することをお勧めします。

注意

次のセクション「ログイン コントロールのレイアウトの構成」では、テンプレートを使用して Layout コントロールのユーザー インターフェイス要素の正確なレイアウトを定義する方法について説明します。

および プロパティを [まだ登録されていません] に設定して、CreateUserTextCreateUserUrlログイン コントロールのプロパティ設定をラップします。 アカウントを作成します。 と ~/Membership/CreatingUserAccounts.aspxをそれぞれ指定します。 これにより、前のチュートリアルで作成したページを指す、ログイン コントロールのインターフェイスへのハイパーリンクが追加されます。 ログイン コントロールとHelpPageTextHelpPageUrlプロパティとプロパティは同じように動作しPasswordRecoveryTextPasswordRecoveryUrl、ヘルプ ページとパスワード回復ページへのリンクが表示されます。

これらのプロパティを変更すると、Login コントロールの宣言型マークアップと外観は、図 5 に示すような外観になります。

ログイン コントロールのプロパティの値によって外観が決まります

図 5: ログイン コントロールのプロパティの値によって外観が決まります (クリックするとフルサイズの画像が表示されます)

ログイン コントロールのレイアウトの構成

Login Web コントロールの既定のユーザー インターフェイスは、HTML <table>でインターフェイスをレイアウトします。 しかし、レンダリングされた出力を細かく制御する必要がある場合はどうでしょうか。 を一連の<div>タグに置き換えた<table>いと思うかもしれません。 または、アプリケーションで認証に追加の資格情報が必要な場合はどうでしょうか。 たとえば、多くの金融 Web サイトでは、ユーザー名とパスワードだけでなく、個人識別番号 (PIN)、またはその他の識別情報も提供する必要があります。 理由が何であれ、Login コントロールをテンプレートに変換し、そこからインターフェイスの宣言型マークアップを明示的に定義できます。

ログイン コントロールを更新して追加の資格情報を収集するには、次の 2 つの操作を行う必要があります。

  1. 追加の資格情報を収集するために、Web コントロールを含むようにログイン コントロールのインターフェイスを更新します。
  2. ユーザー名とパスワードが有効で、追加の資格情報も有効な場合にのみユーザーが認証されるように、ログイン コントロールの内部認証ロジックをオーバーライドします。

最初のタスクを実行するには、Login コントロールをテンプレートに変換し、必要な Web コントロールを追加する必要があります。 2 番目のタスクに関しては、コントロールのイベントのイベント ハンドラーを作成することで、ログイン コントロールのAuthenticate認証ロジックを置き換えることができます。

Login コントロールを更新して、ユーザーにユーザー名、パスワード、メール アドレスの入力を求め、指定されたメール アドレスがファイルのメール アドレスと一致する場合にのみユーザーを認証するようにしましょう。 まず、ログイン コントロールのインターフェイスをテンプレートに変換する必要があります。 ログイン コントロールのスマート タグから、[テンプレートに変換] オプションを選択します。

ログイン コントロールをテンプレートに変換する

図 6: ログイン コントロールをテンプレートに変換する (クリックするとフルサイズの画像が表示されます)

注意

Login コントロールをテンプレート前のバージョンに戻すには、コントロールのスマート タグから [リセット] リンクをクリックします。

Login コントロールをテンプレートに変換すると、ユーザー インターフェイスを定義する HTML 要素と Web コントロールを使用して、 がコントロールの宣言型マークアップに追加 LayoutTemplate されます。 図 7 に示すように、コントロールをテンプレートに変換すると、テンプレートを使用する場合、これらのプロパティ値は無視されるため、プロパティ ウィンドウからプロパティの数 (、 などTitleTextCreateUserUrl) が削除されます。

ログイン コントロールをテンプレートに変換するときに使用できるプロパティが少なくなります

図 7: ログイン コントロールがテンプレートに変換されるときに使用できるプロパティが少なくなります (フルサイズの画像を表示する をクリックします)。

LayoutTemplate HTML マークアップは、必要に応じて変更できます。 同様に、テンプレートに新しい Web コントロールを自由に追加できます。 ただし、ログイン コントロールのコア Web コントロールはテンプレートに残り、割り当てられた ID 値を保持することが重要です。 特に、 または Password TextBoxes、CheckBox、Button、RememberMeLabel、または コントロールのLoginButton名前UserNameFailureText削除したり、名前をRequiredFieldValidator変更したりしないでください。

訪問者のメール アドレスを収集するには、テンプレートに TextBox を追加する必要があります。 TextBox を含むPasswordテーブル行 (<tr>) と、次回 CheckBox を保存するテーブル行の間に、次の宣言型マークアップを追加します。

<tr>
 <td align="right">
 <asp:Label ID="EmailLabel" runat="server" AssociatedControlID="Email">Email:</asp:Label>
 </td>
 <td>
 <asp:TextBox ID="Email" runat="server"></asp:TextBox>
 <asp:RequiredFieldValidator ID="EmailRequired" runat="server"
 ControlToValidate="Email" ErrorMessage="Email is required."
 ToolTip="Email is required." ValidationGroup="myLogin">*</asp:RequiredFieldValidator>
 </td>
</tr>

TextBox を追加した Email 後、ブラウザーからページにアクセスします。 図 8 に示すように、ログイン コントロールのユーザー インターフェイスに 3 番目のテキスト ボックスが含まれるようになりました。

ログイン コントロールに、ユーザーのEmail アドレスのテキスト ボックスが含まれるようになりました

図 8: ログイン コントロールには、ユーザーのEmail アドレスのテキスト ボックスが含まれるようになりました (フルサイズの画像を表示する をクリックします)。

この時点で、Login コントロールは引き続き メソッドを Membership.ValidateUser 使用して、指定された資格情報を検証します。 それに応じて、TextBox に Email 入力された値は、ユーザーがログインできるかどうかに関係ありません。 手順 3 では、ログイン コントロールの認証ロジックをオーバーライドして、ユーザー名とパスワードが有効で、指定された電子メール アドレスがファイルの電子メール アドレスと一致する場合にのみ資格情報が有効と見なされるようにする方法について説明します。

手順 3: ログイン コントロールの認証ロジックを変更する

訪問者が資格情報を入力し、[ログイン] ボタンをクリックすると、ポストバックが続き、ログイン コントロールが認証ワークフローを通じて進行します。 ワークフローは、イベントを発生させることによって開始されますLoggingIn。 このイベントに関連付けられているイベント ハンドラーは、 プロパティを にTrue設定することで、ログイン操作をe.Cancel取り消すことができます。

ログイン操作が取り消されない場合は、 イベントを発生させることによってワークフローがAuthenticate進行します。 イベントの Authenticate イベント ハンドラーがある場合は、指定された資格情報が有効かどうかを判断する必要があります。 イベント ハンドラーが指定されていない場合、Login コントロールは メソッドを Membership.ValidateUser 使用して資格情報の有効性を判断します。

指定された資格情報が有効な場合は、フォーム認証チケットが作成され、 LoggedIn イベント が発生し、ユーザーが適切なページにリダイレクトされます。 ただし、資格情報が無効と見なされた場合LoginErrorは、イベントが発生し、資格情報が無効であることをユーザーに通知するメッセージが表示されます。 既定では、失敗した場合、Login コントロールは Label コントロールの Text プロパティをエラー メッセージに設定 FailureText するだけです (ログイン試行は成功していません。もう一度やり直してください。 ただし、Login コントロールの FailureAction プロパティが にRedirectToLoginPage設定されている場合、Login コントロールは、querystring パラメーター loginfailure=1 を追加してログイン ページに を発行Response.Redirectします (これにより、Login コントロールにエラー メッセージが表示されます)。

図 9 は、認証ワークフローのフローチャートを示しています。

ログイン コントロールの認証ワークフロー

図 9: ログイン コントロールの認証ワークフロー (フルサイズの画像を表示する をクリックします)

注意

のページ オプションをいつ使用するのか疑問に FailureAction思う場合は、次の RedirectToLogin シナリオを検討してください。 現在、 Site.master マスター ページには、匿名ユーザーがアクセスしたときに左側の列に表示されるテキスト Hello、見知らぬ人が表示されていますが、そのテキストを Login コントロールに置き換えたいと考えています。 これにより、匿名ユーザーは、ログイン ページに直接アクセスする必要なく、サイト上の任意のページからログインできるようになります。 ただし、ユーザーがマスター ページによってレンダリングされたログイン コントロールを使用してログインできなかった場合は、そのページに追加の手順、リンク、その他のヘルプ (新しいアカウントを作成するためのリンクやパスワードを失ったパスワードを取得するリンクなど) が含まれている可能性があるため、マスター ページに追加されていないログイン ページ (Login.aspx) にリダイレクトすることをお客様が適している可能性があります。

イベント ハンドラーのAuthenticate作成

カスタム認証ロジックをプラグインするには、Login コントロール Authenticate のイベントのイベント ハンドラーを作成する必要があります。 イベントのイベント ハンドラー Authenticate を作成すると、次のイベント ハンドラー定義が生成されます。

Protected Sub myLogin_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles myLogin.Authenticate

End Sub

ご覧のように、 Authenticate イベント ハンドラーには、2 番目の入力パラメーターとして 型 AuthenticateEventArgs のオブジェクトが渡されます。 AuthenticateEventArgsクラスには、 という名前Authenticatedのブール型プロパティが含まれています。このプロパティは、指定された資格情報が有効かどうかを指定するために使用されます。 次に、指定された資格情報が有効かどうかを判断するコードをここに記述し、それに応じて プロパティを e.Authenticate 設定します。

指定された資格情報の決定と検証

Login コントロールと UserNamePassword プロパティ を使用して、ユーザーが入力したユーザー名とパスワードの資格情報を決定します。 追加の Web コントロール (前の手順で追加した TextBox などEmail) に入力した値を確認するには、("controlID") を使用LoginControlID.FindControlして、 プロパティが ID と等しいテンプレート内の Web コントロールへのプログラムによる参照をcontrolID取得します。 たとえば、TextBox への Email 参照を取得するには、次のコードを使用します。

Dim EmailTextBox As TextBox = CType(myLogin.FindControl("Email"), TextBox)

ユーザーの資格情報を検証するには、次の 2 つの操作を行う必要があります。

  1. 指定されたユーザー名とパスワードが有効であることを確認する
  2. 入力したメール アドレスが、ログインしようとしているユーザーのファイルのメール アドレスと一致していることを確認します

最初のチェックを実現するには、手順 1 で説明したように、 メソッドを使用Membership.ValidateUserするだけです。 2 番目のチェックでは、TextBox コントロールに入力したメール アドレスと比較できるように、ユーザーのメール アドレスを確認する必要があります。 特定のユーザーに関する情報を取得するには、 クラスの GetUser メソッドMembership使用します。

GetUserメソッドには、いくつかのオーバーロードがあります。 パラメーターを渡さずに使用すると、現在ログインしているユーザーに関する情報が返されます。 特定のユーザーに関する情報を取得するには、ユーザー名を渡す を呼び出 GetUser します。 どちらの方法でも、 GetUser は、、などのIsApprovedUserNameIsOnlineEmailプロパティを持つ オブジェクトを返MembershipUserします。

次のコードでは、これら 2 つのチェックを実装します。 両方が を渡す場合は、 e.Authenticate が に True設定されます。それ以外の場合は が False割り当てられます。

Protected Sub myLogin_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles myLogin.Authenticate
    
 ' Get the email address entered
 Dim EmailTextBox As TextBox = CType(myLogin.FindControl("Email"), TextBox)
 Dim email As String = EmailTextBox.Text.Trim()
    
 ' Verify that the username/password pair is valid
 If Membership.ValidateUser(myLogin.UserName, myLogin.Password) Then

 ' Username/password are valid, check email
 Dim usrInfo As MembershipUser = Membership.GetUser(myLogin.UserName)
    
 If usrInfo IsNot Nothing AndAlso String.Compare(usrInfo.Email, email, True) = 0 Then
 ' Email matches, the credentials are valid
 e.Authenticated = True
 Else
 ' Email address is invalid...
 e.Authenticated = False
 End If
 Else
 ' Username/password are not valid...
 e.Authenticated = False
 End If
End Sub

このコードを設定した状態で、正しいユーザー名、パスワード、メール アドレスを入力して、有効なユーザーとしてログインを試みます。 もう一度お試しくださいが、今回は意図的に正しくないメール アドレスを使用します (図 10 を参照)。 最後に、存在しないユーザー名を使用して 3 回目に試します。 最初のケースでは、サイトに正常にログオンする必要がありますが、最後の 2 つのケースでは、ログイン コントロールの無効な資格情報メッセージが表示されます。

正しくないEmail アドレスを指定した場合、Tito はログインできません

図 10: 正しくないEmail アドレスを指定すると Tito はログインできません (フルサイズの画像を表示する をクリックします)

注意

手順 1 の「メンバーシップ フレームワークによる無効なログイン試行の処理方法」セクションで説明したように、メソッドが呼び出され、無効な資格情報が渡されると Membership.ValidateUser 、無効なログイン試行が追跡され、指定された時間枠内で無効な試行の特定のしきい値を超えた場合にユーザーがロックアウトされます。 カスタム認証ロジックは メソッドを ValidateUser 呼び出すので、有効なユーザー名のパスワードが正しくないと、無効なログイン試行カウンターがインクリメントされますが、ユーザー名とパスワードが有効であるが、メール アドレスが正しくない場合、このカウンターはインクリメントされません。 ハッカーがユーザー名とパスワードを知る可能性は低いが、ブルート フォース手法を使用してユーザーのメール アドレスを特定する必要があるため、この動作が適している可能性があります。

手順 4: ログイン コントロールの無効な資格情報メッセージを改善する

ユーザーが無効な資格情報でログオンしようとすると、ログイン の試行が失敗したことを示すメッセージがログイン コントロールに表示されます。 特に、コントロールには、そのプロパティでFailureText指定されたメッセージが表示されます。既定値は [ログイン試行が失敗しました] です。 もう一度やり直してください。

ユーザーの資格情報が無効になる理由は多数あることを思い出してください。

  • ユーザー名が存在しない可能性があります
  • ユーザー名は存在しますが、パスワードが無効です
  • ユーザー名とパスワードは有効ですが、ユーザーはまだ承認されていません
  • ユーザー名とパスワードは有効ですが、ユーザーはロックアウトされています (指定された期間内に無効なログイン試行回数を超えた可能性が高い)

また、カスタム認証ロジックを使用する場合は、他にも理由が考えられる場合があります。 たとえば、手順 3 で記述したコードでは、ユーザー名とパスワードは有効ですが、メール アドレスが正しくない可能性があります。

資格情報が無効な理由に関係なく、ログイン コントロールには同じエラー メッセージが表示されます。 このフィードバックの欠如は、アカウントがまだ承認されていないユーザーやロックアウトされているユーザーにとって混乱を招く可能性があります。ただし、少しの作業では、ログイン コントロールにより適切なメッセージを表示させることができます。

ユーザーが無効な資格情報を使用してログインしようとすると、Login コントロールによって LoginError イベントが発生します。 先に進み、このイベントのイベント ハンドラーを作成し、次のコードを追加します。

Protected Sub myLogin_LoginError(ByVal sender As Object, ByVal e As System.EventArgs) Handles myLogin.LoginError
    
 ' Determine why the user could not login...
 myLogin.FailureText = "Your login attempt was not successful. Please try again."
    
 ' Does there exist a User account for this user?
 Dim usrInfo As MembershipUser = Membership.GetUser(myLogin.UserName)

 If usrInfo IsNot Nothing Then
 ' Is this user locked out?
 If usrInfo.IsLockedOut Then
 myLogin.FailureText = "Your account has been locked out because of too many invalid login attempts. Please contact the administrator to have your account unlocked."
 ElseIf Not usrInfo.IsApproved Then
 myLogin.FailureText = "Your account has not yet been approved. You cannot login until an administrator has approved your account."
 End If
 End If
End Sub

上記のコードは、まず Login コントロールの FailureText プロパティを既定値に設定します (ログイン試行は成功していません。もう一度お試しください。 次に、指定されたユーザー名が既存のユーザー アカウントにマップされているかどうかを確認します。 その場合は、結果の MembershipUser オブジェクト IsLockedOutIsApproved プロパティを調べて、アカウントがロックアウトされているか、まだ承認されていないかを判断します。 どちらの場合も、 FailureText プロパティは対応する値に更新されます。

このコードをテストするには、意図的に既存のユーザーとしてログインしようとしますが、正しくないパスワードを使用してください。 これを 10 分以内に 5 回連続して実行すると、アカウントはロックアウトされます。図 11 に示すように、以降のログイン試行は常に失敗しますが (正しいパスワードを使用しても)、無効なログイン試行が多すぎるため、アカウントがロックアウトされたというわかりやすい内容が表示されるようになります。 アカウントのロック解除メッセージを管理者に問い合わせてください。

Tito で無効なログイン試行が多すぎてロックアウトされました

図 11: Tito で無効なログイン試行が多すぎてロックアウトされている (フルサイズの画像を表示するをクリックします)

まとめ

このチュートリアルの前に、ログイン ページでは、ユーザー名とパスワードのペアのハードコーディングされたリストに対して、指定された資格情報を検証しました。 このチュートリアルでは、メンバーシップ フレームワークに対して資格情報を検証するようにページを更新しました。 手順 1 では、 メソッドをプログラムで使用する方法を Membership.ValidateUser 確認しました。 手順 2 では、手動で作成したユーザー インターフェイスとコードを Login コントロールに置き換えます。

Login コントロールは、標準のログイン ユーザー インターフェイスをレンダリングし、メンバーシップ フレームワークに対してユーザーの資格情報を自動的に検証します。 さらに、有効な資格情報が必要な場合、Login コントロールはフォーム認証を介してユーザーをサインインさせます。 つまり、ログイン コントロールをページにドラッグするだけで、完全に機能するログイン ユーザー エクスペリエンスを利用できます。追加の宣言型マークアップやコードは必要ありません。 さらに、Login コントロールは高度にカスタマイズ可能であり、レンダリングされたユーザー インターフェイスと認証ロジックの両方を細かく制御できます。

この時点で、Web サイトの訪問者は新しいユーザー アカウントを作成してサイトにログインできますが、認証されたユーザーに基づいてページへのアクセスを制限する方法はまだ確認されていません。 現在、認証または匿名のユーザーは、サイト上の任意のページを表示できます。 ユーザーごとにサイトのページへのアクセスを制御するとともに、ユーザーに依存する機能を持つ特定のページがある場合があります。 次のチュートリアルでは、ログインしているユーザーに基づいてアクセスとページ内機能を制限する方法について説明します。

プログラミングに満足!

もっと読む

このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。

著者について

複数の 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行をドロップしてください。