パスワードを復元し、変更する (VB)

作成者: Scott Mitchell

注意

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

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

ASP.NET には、パスワードの回復と変更を支援するための 2 つの Web コントロールが含まれています。 PasswordRecovery コントロールを使用すると、訪問者は失われたパスワードを回復できます。 ChangePassword コントロールを使用すると、ユーザーは自分のパスワードを更新できます。 このチュートリアル シリーズで見てきた他のログイン関連の Web コントロールと同様に、PasswordRecovery コントロールと ChangePassword コントロールは、バックグラウンドで Membership フレームワークと連携して、ユーザーのパスワードをリセットまたは変更します。

はじめに

私の銀行、ユーティリティ会社、電話会社、電子メール アカウント、パーソナライズされた Web ポータルの Web サイト間で、私はほとんどの人と同様に、覚えておく必要があるさまざまなパスワードの数十を持っています。 最近は非常に多くの資格情報が記憶されるため、パスワードを忘れるのは珍しくありません。 これを考慮するには、ユーザー アカウントを提供する Web サイトに、ユーザーがパスワードを回復する方法を含める必要があります。 通常、このプロセスでは、新しいランダムなパスワードを生成し、ファイル上のユーザーのメール アドレスに電子メールで送信します。 新しいパスワードを受け取った後、ほとんどのユーザーはサイトに戻り、ランダムに生成されたパスワードから覚えやすいパスワードに変更します。

ASP.NET には、パスワードの回復と変更を支援するための 2 つの Web コントロールが含まれています。 PasswordRecovery コントロールを使用すると、訪問者は失われたパスワードを回復できます。 ChangePassword コントロールを使用すると、ユーザーは自分のパスワードを更新できます。 このチュートリアル シリーズで見てきた他のログイン関連の Web コントロールと同様に、PasswordRecovery コントロールと ChangePassword コントロールは、バックグラウンドで Membership フレームワークと連携して、ユーザーのパスワードをリセットまたは変更します。

このチュートリアルでは、これら 2 つのコントロールの使用について説明します。 また、クラスChangePasswordの メソッドと メソッドを使用してMembershipUser、ユーザーのパスワードをプログラムで変更およびResetPasswordリセットする方法についても説明します。

手順 1: ユーザーが失われたパスワードを回復するのを支援する

ユーザー アカウントをサポートするすべての Web サイトでは、忘れたパスワードを回復するためのメカニズムをユーザーに提供する必要があります。 良いニュースは、ASP.NET でこのような機能を実装することは、PasswordRecovery Web コントロールのおかげで簡単です。 PasswordRecovery コントロールは、ユーザーにユーザー名の入力を求めるインターフェイスと、必要に応じてセキュリティに関する質問に対する回答を表示します。 その後、ユーザーにパスワードを電子メールで送信します。

注意

電子メール メッセージはプレーンテキストでネットワーク経由で送信されるため、ユーザーのパスワードを電子メールで送信する際にセキュリティ上のリスクがあります。

PasswordRecovery コントロールは、次の 3 つのビューで構成されます。

  • UserName - 訪問者にユーザー名の入力を求めます。 これが最初のビューです。
  • 質問 - ユーザーのユーザー名とセキュリティの質問をテキストとして表示し、ユーザーがセキュリティの質問に対する回答を入力するための TextBox と共に表示します。
  • [成功] - パスワードが電子メールで送信されたことをユーザーに通知するメッセージが表示されます。

表示されるビューと PasswordRecovery コントロールによって実行されるアクションは、次のメンバーシップ構成設定によって異なります。

  • RequiresQuestionAndAnswer
  • EnablePasswordRetrieval
  • EnablePasswordReset

メンバーシップ フレームワークの RequiresQuestionAndAnswer 設定は、ユーザーがアカウントに登録するときにセキュリティの質問と回答を指定する必要があるかどうかを示します。 ユーザー アカウント作成チュートリアルで説明したように、 が True (既定値) の場合RequiresQuestionAndAnswer、CreateUserWizard のインターフェイスには、新しいユーザーのセキュリティの質問と回答の TextBox コントロールが含まれます。が False の場合RequiresQuestionAndAnswer、そのような情報は収集されません。 同様に、 が True の場合 RequiresQuestionAndAnswer 、ユーザーがユーザー名を入力した後に PasswordRecovery コントロールに質問ビューが表示されます。パスワードは、ユーザーが正しいセキュリティ回答を入力した場合にのみ回復されます。 が False の場合 RequiresQuestionAndAnswer 、PasswordRecovery コントロールは UserName ビューから成功ビューに直接移動します。

ユーザーがユーザー名を指定した後、またはユーザー名とセキュリティの回答が True の場合 RequiresQuestionAndAnswer 、PasswordRecovery はユーザーにパスワードを電子メールで送信します。 オプションが EnablePasswordRetrieval True に設定されている場合、ユーザーには現在のパスワードが電子メールで送信されます。 False に設定され EnablePasswordReset 、True に設定されている場合、PasswordRecovery コントロールはユーザーの新しいランダムなパスワードを生成し、この新しいパスワードを電子メールで送信します。 と EnablePasswordReset の両方EnablePasswordRetrievalが False の場合、PasswordRecovery コントロールは例外をスローします。

注意

には、 SqlMembershipProvider Clear、Hashed (既定値)、Encrypted の 3 つの形式のいずれかでユーザーのパスワードが格納されていることを思い出してください。 使用されるストレージ メカニズムは、メンバーシップの構成設定によって異なります。デモ アプリケーションでは、ハッシュされたパスワード形式が使用されます。 ハッシュされたパスワード形式 EnablePasswordRetrieval を使用する場合、システムはデータベースに格納されているハッシュされたバージョンからユーザーの実際のパスワードを判断できないため、オプションを False に設定する必要があります。

図 1 は、PasswordRecovery のインターフェイスと動作がメンバーシップ構成によってどのように影響されるかを示しています。

RequiresQuestionAndAnswer、EnablePasswordRetrieval、および EnablePasswordReset PasswordRecovery コントロールの外観と動作に影響を与える

図 1: 、RequiresQuestionAndAnswerEnablePasswordRetrieval、および EnablePasswordReset PasswordRecovery コントロールの外観と動作に影響を与える (フルサイズの画像を表示する をクリックします)

注意

SQL Serverチュートリアルのメンバーシップ スキーマの作成で、メンバーシップ プロバイダーを True、False、 EnablePasswordRetrieval True EnablePasswordReset に設定RequiresQuestionAndAnswerして構成しました。

PasswordRecovery コントロールの使用

ASP.NET ページで PasswordRecovery コントロールを使用する方法を見てみましょう。 [ツールボックス] から [PasswordRecovery] コントロールを開RecoverPassword.aspxき、Designerにドラッグ アンド ドロップします。そのIDコントロールを にRecoverPwd設定します。 Login コントロールや CreateUserWizard Web コントロールと同様に、PasswordRecovery コントロールのビューは、Labels、TextBoxes、Buttons、および検証コントロールを含む豊富な複合インターフェイスをレンダリングします。 コントロールのスタイル プロパティを使用するか、ビューをテンプレートに変換することで、ビューの外観をカスタマイズできます。 私はこれを興味のある読者のための演習として残します。

ユーザーがこのページにアクセスすると、ユーザー名を入力し、[送信] ボタンをクリックします。 メンバーシップ構成設定で プロパティを RequiresQuestionAndAnswer True に設定したため、PasswordRecovery コントロールに質問ビューが表示されます。 ユーザーが正しいセキュリティ回答を入力して [送信] をクリックすると、PasswordRecovery コントロールによってユーザーのパスワードがランダムに生成されたパスワードに更新され、このパスワードがファイルのメール アドレスに電子メールで送信されます。 これはすべて、1 行のコードを記述しなくても可能でした。

このページをテストする前に、 でメール配信設定 Web.configを指定する必要があります。 PasswordRecovery コントロールは、電子メールを送信するためにこれらの設定に依存します。

メール配信の構成は、 要素の <mailSettings> 要素<system.net>介して指定されます。 要素を<smtp>使用して、配信方法と既定の From アドレスを示します。 次のマークアップでは、ポート 25 でという名前 smtp.example.com のネットワーク SMTP サーバーを使用し、ユーザー名とパスワードのユーザー名/パスワード資格情報を使用するようにメール設定を構成します。

注意

<system.net> はルート <configuration> 要素の子要素であり、 の <system.web>兄弟です。 したがって、要素内に要素を<system.net><system.web>配置しないでください。代わりに、同じレベルに配置します。

<configuration>
 ...
 <system.net>
 <mailSettings>
 <smtp deliveryMethod="Network" from="youraddress@example.com">
 <network
 host="smtp.example.com"
 userName="username"
 password="password"
 port="25" />
 </smtp>
 </mailSettings>
 </system.net>
</configuration>

ネットワーク上の SMTP サーバーを使用するだけでなく、送信する電子メール メッセージを受信するピックアップ ディレクトリを指定することもできます。

SMTP 設定を構成したら、ブラウザーからページに RecoverPassword.aspx アクセスします。 まず、ユーザー ストアに存在しないユーザー名を入力してみてください。 図 2 に示すように、PasswordRecovery コントロールには、ユーザー情報にアクセスできなかったことを示すメッセージが表示されます。 メッセージのテキストは、コントロールの UserNameFailureText プロパティを使用してカスタマイズできます。

無効なユーザー名が入力された場合にエラー メッセージが表示される

図 2: 無効なユーザー名が入力された場合にエラー メッセージが表示される (フルサイズの画像を表示する をクリックします)

次に、ユーザー名を入力します。 システム内のアカウントのユーザー名を、アクセスできるメール アドレスと、セキュリティに関する回答を知っているユーザー名と共に使用します。 ユーザー名を入力して [送信] をクリックすると、PasswordRecovery コントロールに [質問] ビューが表示されます。 UserName ビューと同様に、正しくない回答を入力すると、PasswordRecovery コントロールにエラー メッセージが表示されます (図 3 を参照)。 このエラー メッセージをカスタマイズするには、 QuestionFailureText プロパティ を使用します。

ユーザーが無効なセキュリティ回答を入力すると、エラー メッセージが表示される

図 3: ユーザーが無効なセキュリティ応答を入力するとエラー メッセージが表示される (フルサイズの画像を表示する をクリックします)

最後に、正しいセキュリティ回答を入力し、[送信] をクリックします。 バックグラウンドでは、PasswordRecovery コントロールによってランダムなパスワードが生成され、ユーザー アカウントに割り当てられ、ユーザーに新しいパスワードを通知する電子メールが送信され (図 4 を参照)、成功ビューが表示されます。

ユーザーが新しいパスワードを使用してEmailを送信される

図 4: ユーザーが新しいパスワードを使用してEmailを送信する (フルサイズの画像を表示する をクリックします)

Emailのカスタマイズ

PasswordRecovery コントロールによって送信される既定のメールは、かなり鈍いです (図 4 を参照)。 メッセージは、 要素fromの 属性で<smtp>指定されたアカウントから、件名 Password とプレーンテキスト本文で送信されます。

サイトに戻り、次の情報を使用してログインしてください。

ユーザー名: username

パスワード: password

このメッセージは、PasswordRecovery コントロールSendingMailのイベント ハンドラーを使用してプログラムでカスタマイズすることも、 プロパティを使用してMailDefinition宣言によってカスタマイズすることもできます。 これらのオプションの両方を調べてみましょう。

イベントは SendingMail 、電子メール メッセージが送信される直前に発生し、電子メール メッセージをプログラムで調整する最後の機会です。 このイベントが発生すると、イベント ハンドラーには 型 MailMessageEventArgsの オブジェクトが渡されます。このオブジェクトの Message プロパティには、送信される電子メールへの参照が含まれます。

イベントのイベント ハンドラーを SendingMail 作成し、プログラムによって CC リストに追加する次のコードを追加 webmaster@example.com します。

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)Handles RecoverPwd.SendingMail
 e.Message.CC.Add("webmaster@example.com")
End Sub

電子メール メッセージは、宣言型の手段を使用して構成することもできます。 PasswordRecovery の MailDefinition プロパティは、 型 MailDefinitionのオブジェクトです。 クラスはMailDefinition、などのSubjectBodyFileNameFromCCPriorityIsBodyHtml電子メール関連のプロパティのホストを提供します。 まず、 プロパティをSubject、既定で使用されている (パスワード) よりもわかりやすいものに設定します(パスワードがリセットされました)。.

電子メール メッセージの本文をカスタマイズするには、本文の内容を含む別の電子メール テンプレート ファイルを作成する必要があります。 まず、 という名前 EmailTemplatesの Web サイトに新しいフォルダーを作成します。 次に、 という名前 PasswordRecovery.txt の新しいテキスト ファイルをこのフォルダーに追加し、次の内容を追加します。

Your password has been reset, <%UserName%>!

According to our records, you have requested that your password be reset. Your new
password is: <%Password%>

If you have any questions or trouble logging on please contact a site administrator.

Thank you!

プレースホルダー と <%Password%>の使用に注意してください<%UserName%>。 PasswordRecovery コントロールは、電子メールを送信する前に、これら 2 つのプレースホルダーをユーザーのユーザー名と回復したパスワードに自動的に置き換えます。

最後に、 の BodyFileName プロパティMailDefinition先ほど作成したメール テンプレート (~/EmailTemplates/PasswordRecovery.txt) にポイントします。

これらの変更を行った後、ページを RecoverPassword.aspx 見直し、ユーザー名とセキュリティの回答を入力します。 図 5 のようなメールが届きます。 webmaster@example.comが CC'd であり、件名と本文が更新されていることに注意してください。

件名、本文、CC リストが更新されました

図 5: 件名、本文、CC リストが更新されました (フルサイズの画像を表示する をクリックします)

Html 形式の電子メールを True に設定 IsBodyHtml して送信し (既定値は False)、電子メール テンプレートを更新して HTML を含めます。

プロパティは MailDefinition PasswordRecovery クラスに固有ではありません。 手順 2 で説明するように、ChangePassword コントロールには プロパティも用意されています MailDefinition 。 さらに、CreateUserWizard コントロールには、新しいユーザーにウェルカム メール メッセージを自動的に送信するように構成できるプロパティが含まれています。

注意

現在、左側のナビゲーションには、ページにアクセスするための RecoverPassword.aspx リンクはありません。 ユーザーは、サイトに正常にログオンできなかった場合にのみ、このページにアクセスすることに関心があります。 そのため、ページへのリンクを Login.aspx 含むようにページを RecoverPassword.aspx 更新します。

プログラムによるユーザーのパスワードのリセット

ユーザーのパスワードをリセットする場合、PasswordRecovery コントロールは オブジェクトの ResetPassword メソッドMembershipUser呼び出します。 このメソッドには 2 つのオーバーロードがあります。

  • ResetPassword - ユーザーのパスワードをリセットします。 が False の場合 RequiresQuestionAndAnswer は、このオーバーロードを使用します。
  • ResetPassword(securityAnswer) - 指定された securityAnswer が正しい場合にのみ、ユーザーのパスワードをリセットします。 が True の場合 RequiresQuestionAndAnswer は、このオーバーロードを使用します。

どちらのオーバーロードも、ランダムに生成された新しいパスワードを返します。

Membership フレームワークの他のメソッドと同様に、メソッドは ResetPassword 構成されたプロバイダーに委任します。 は SqlMembershipProvider ストアド プロシージャを aspnet_Membership_ResetPassword 呼び出し、ユーザーのユーザー名、新しいパスワード、および指定されたパスワード応答を他のフィールドの中から渡します。 ストアド プロシージャを使用すると、パスワードの応答が一致し、ユーザーのパスワードが更新されます。

いくつかの低レベルの実装に関する注意事項:

  • ロックアウトされたユーザーは、パスワードをリセットできません。 ただし、未承認のユーザーは可能性があります。 ロックアウトされた状態と承認された状態については、ユーザー アカウントのロック解除と承認関するチュートリアルで詳しく説明します。
  • パスワードの回答が正しくない場合、ユーザーの失敗したパスワード応答の試行回数が増加します。 指定した時間内に、指定された数の無効なセキュリティ回答試行が発生した場合、ユーザーはロックアウトされます。

ランダム パスワードの生成方法に関するWord

図 4 と図 5 の電子メール メッセージに示されているランダムに生成されたパスワードは、Membership クラスの GeneratePassword メソッドによって作成されます。 このメソッドは、 lengthnumberOfNonAlphanumericCharacters の 2 つの整数入力パラメーターを受け取り、英数字以外 の文字のnumberOfNonAlphanumericCharacters 番号を持つ長さ以上の文字列を返します。 このメソッドが Membership クラスまたはログイン関連 Web コントロール内から呼び出されると、これら 2 つのパラメーターの値は、それぞれ 7 と 1 に設定した Membership 構成 MinRequiredPasswordLengthMinRequiredNonalphanumericCharacters プロパティによって決定されます。

このメソッドでは GeneratePassword 、暗号的に強力な乱数ジェネレーターを使用して、どのランダム文字が選択されているかに偏りがないことを確認します。 さらに、 は Publicです。つまり、GeneratePasswordランダムな文字列またはパスワードを生成する必要がある場合は、ASP.NET アプリケーションから直接使用できます。

注意

クラスは SqlMembershipProvider 常に 14 文字以上のランダムなパスワードを生成するため、 が 14 文字未満の場合 MinRequiredPasswordLength 、その値は無視されます。

手順 2: パスワードの変更

ランダムに生成されたパスワードは覚えにくいです。 図 4: WWGUZv(f2yM:Bdに示されているパスワードを考えてみましょう。 メモリにコミットしてみてください。 言うまでもなく、ユーザーがこの種のランダムに生成されたパスワードを送信した後、パスワードをより覚えやすいものに変更したいと考えています。

ChangePassword コントロールを使用して、ユーザーがパスワードを変更するためのインターフェイスを作成します。 PasswordRecovery コントロールと同様に、ChangePassword コントロールは、[パスワードの変更] と [成功] の 2 つのビューで構成されます。 [パスワードの変更] ビューでは、ユーザーに古いパスワードと新しいパスワードの入力を求められます。 正しい古いパスワードと、英数字以外の最小文字数の要件を満たす新しいパスワードを指定すると、ChangePassword コントロールによってユーザーのパスワードが更新され、[成功] ビューが表示されます。

注意

ChangePassword コントロールは、 オブジェクトの メソッドを呼び出すことによって、ユーザーのChangePasswordパスワードをMembershipUser変更します。 ChangePassword メソッドは、oldPasswordnewPassword の 2 つのString入力パラメーターを受け取り、指定された oldPassword が正しいと仮定して、ユーザーのアカウントを newPassword で更新します。

ページを ChangePassword.aspx 開き、ChangePassword コントロールをページに追加し、 という名前を付けます ChangePwd。 この時点で、[デザイン] ビューに [パスワードの変更] ビューが表示されます (図 6 を参照)。 PasswordRecovery コントロールと同様に、コントロールのスマート タグを使用してビューを切り替えることができます。 さらに、これらのビューの外観は、並べ替えたスタイル プロパティまたはテンプレートに変換することでカスタマイズできます。

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

図 6: ChangePassword コントロールをページに追加する (フルサイズの画像を表示する をクリックします)

ChangePassword コントロールは、現在ログインしているユーザーのパスワード または 別の指定されたユーザーのパスワードを更新できます。 図 6 に示すように、既定の [パスワードの変更] ビューでは、3 つの TextBox コントロール (古いパスワードの場合は 1 つ、新しいパスワードの場合は 2 つ) だけがレンダリングされます。 この既定のインターフェイスは、現在ログオンしているユーザーのパスワードを更新するために使用されます。

ChangePassword コントロールを使用して別のユーザーのパスワードを更新するには、コントロールの DisplayUserName プロパティ を True に設定します。 これにより、4 番目の TextBox がページに追加され、パスワードを変更するユーザーのユーザー名の入力を求められます。

True に設定 DisplayUserName すると、ログインしなくても、ログアウトしたユーザーが自分のパスワードを変更できるようにする場合に便利です。 個人的には、パスワードの変更を許可する前にユーザーにログインを要求することには何の問題もないと思います。 そのため、False (既定値) に設定したまま DisplayUserName にします。 ただし、この決定を行う際には、基本的に匿名ユーザーがこのページに到達することを禁止しています。 匿名ユーザーの アクセスを拒否するように、サイトの URL 承認規則を更新します ChangePassword.aspx。 URL 承認規則の構文でメモリを更新する必要がある場合は、ユーザーベースの承認に関するチュートリアルを参照してください。

注意

プロパティは、管理者が他の DisplayUserName ユーザーのパスワードを変更できるようにするために役立つと思われる場合があります。 ただし、 が True に設定されている場合 DisplayUserName でも、正しい古いパスワードを認識して入力する必要があります。 手順 3 では、管理者がユーザーのパスワードを変更できるようにする手法について説明します。

ブラウザーからページに ChangePassword.aspx アクセスし、パスワードを変更します。 メンバーシップ構成で指定されたパスワード長と英数字以外の文字要件を満たしていない新しいパスワードを入力すると、エラー メッセージが表示されることに注意してください (図 7 を参照)。

パスワードの長さと英数字以外の文字の要件を満たしていない新しいパスワードを入力すると、エラー メッセージが表示されます。

図 7: ChangePassword コントロールをページに追加する (フルサイズの画像を表示する をクリックします)

正しい古いパスワードと有効な新しいパスワードを入力すると、ログオンしているユーザーのパスワードが変更され、[成功] ビューが表示されます。

確認Emailの送信

既定では、ChangePassword コントロールは、パスワードが更新されたユーザーに電子メール メッセージを送信しません。 メールを送信する場合は、コントロールの MailDefinition プロパティを構成するだけです。 ユーザーが新しいパスワードを含む HTML 形式の電子メールを送信するように ChangePassword コントロールを構成してみましょう。

まず、 という名前ChangePassword.htmのフォルダーに新しいファイルをEmailTemplates作成します。 次のマークアップを追加します。

<html>
 <body>
 <h2>Your Password Has Been Changed!</h2>
 <p>
 This email confirms that your password has been changed.
 </p>
 <p>
 To log on to the site, use the following credentials:
 </p>
 <table>
 <tr>
 <td>
 <b>Username:</b>
 </td>
 <td>
 <%UserName%>
 </td>
 </tr>
 <tr>
 <td>
 <b>Password:</b>
 </td>
 <td>
 <%Password%>
 </td>
 </tr>
 </table>
 <p>
 If you have any questions or encounter any problems logging in,
 please contact a site administrator.
 </p>
 </body>
</html>

次に、ChangePassword コントロールの MailDefinition プロパティの BodyFileName、、 IsBodyHtmlおよび Subject プロパティをそれぞれ ~/EmailTemplates/ChangePassword.htm、True、および Your password has changed! に設定します。

これらの変更を行った後、ページに戻り、パスワードをもう一度変更します。 今回は、ChangePassword コントロールによって、カスタマイズされた HTML 形式の電子メールがファイル上のユーザーのメール アドレスに送信されます (図 8 を参照)。

パスワードが変更されたことをユーザーに通知するEmail メッセージ

図 8: パスワードが変更されたことをユーザーに通知するEmail メッセージ (フルサイズの画像を表示する をクリックします)

手順 3: 管理者がユーザーのパスワードを変更できるようにする

ユーザー アカウントをサポートするアプリケーションの一般的な機能は、管理ユーザーが他のユーザーのパスワードを変更できることです。 ユーザーが自分のパスワードを変更する機能がシステムにないため、この機能が必要な場合があります。 このような場合、ユーザーが忘れたパスワードを回復する唯一の方法は、管理者が新しいパスワードを割り当てることです。 ただし、PasswordRecovery コントロールと ChangePassword コントロールを使用すると、管理ユーザーは、ユーザーが自分でパスワードを変更する必要があります。

しかし、管理ユーザーが他のユーザーのパスワードを変更できるようにする必要があるとクライアントが主張した場合はどうでしょうか。 残念ながら、この機能を追加することは少し作業になる可能性があります。 ユーザーのパスワードを変更するには、古いパスワードと新しいパスワードの両方をオブジェクトのChangePasswordメソッドに指定するMembershipUser必要がありますが、変更するために管理者がユーザーのパスワードを知る必要はありません。

回避策の 1 つは、最初にユーザーのパスワードをリセットしてから、次のようなコードを使用して新しいパスワードに変更することです。

Dim usr As MembershipUser = Membership.GetUser(username)
Dim resetPwd As String = usr.ResetPassword()
usr.ChangePassword(resetPwd, newPassword)

このコードは、まず、管理者が変更するパスワードを持つユーザーであるユーザー に関する情報を取得することから始めます。 次に ResetPassword 、 メソッドが呼び出され、ユーザーに新しいランダム なパスワードが割り当てられます。 このランダムに生成されたパスワードは、 メソッドによって返され、変数 resetPwdに格納されます。 ユーザーのパスワードがわかったので、 の ChangePassword呼び出しで変更できます。

問題は、メンバーシップ システム構成が False に RequiresQuestionAndAnswer 設定されている場合にのみ、このコードが機能することです。 が True の場合 RequiresQuestionAndAnswer は、アプリケーションと同様に、メソッドに ResetPassword セキュリティ応答を渡す必要があります。それ以外の場合は例外がスローされます。

メンバーシップ フレームワークがセキュリティの質問と回答を必要とするように構成されているにもかかわらず、管理者がユーザーのパスワードを変更できることをクライアントが要求する場合は、次の 3 つのオプションがあります。

  • 手を空中に投げ込み、これができないことの一つであることをクライアントに伝えます。
  • False に設定 RequiresQuestionAndAnswer します。 これにより、アプリケーションの安全性が低下します。 悪質なユーザーが別のユーザーのメール 受信トレイにアクセスしたとします。 おそらく、侵害されたユーザーは、昼食に行くために机を離れてワークステーションをロックしなかったか、パブリック ターミナルからメールにアクセスしてサインアウトしなかった可能性があります。いずれの場合も、悪質なユーザーはページに RecoverPassword.aspx アクセスし、ユーザーのユーザー名を入力できます。 その後、システムは、セキュリティの回答を求めることなく、回復したパスワードを電子メールで送信します。
  • Membership フレームワークによって作成された抽象化レイヤーをバイパスし、SQL Server データベースを直接操作します。 メンバーシップ スキーマには、 という名前 aspnet_Membership_SetPassword のストアド プロシージャが含まれています。このストアド プロシージャは、ユーザーのパスワードを設定し、そのタスクを実行するためにセキュリティ応答や古いパスワードを必要としません。

これらのオプションはどれも特に魅力的ではありませんが、開発者の生活は時にはそのようなものです。

先に進み、3 つ目のアプローチを実装し、 クラスと MembershipUser クラスをMembershipバイパスし、データベースに対して直接操作するコードをSecurityTutorials記述しました。

注意

データベースを直接操作することで、メンバーシップ フレームワークによって提供されるカプセル化が粉々になります。 この決定により、 に結び付け、コードの SqlMembershipProvider移植性が低下します。 さらに、メンバーシップ スキーマが変更された場合、このコードは将来のバージョンの ASP.NET で期待どおりに動作しない可能性があります。 この方法は回避策であり、ほとんどの回避策と同様に、ベスト プラクティスの例ではありません。

コードには魅力的でないビットがいくつかあり、非常に長いです。 したがって、私はそれの詳細な調査でこのチュートリアルを乱雑にしたくない。 詳細については、このチュートリアルのコードをダウンロードし、ページにアクセスしてください ~/Administration/ManageUsers.aspx前のチュートリアルで作成したこのページには、各ユーザーが一覧表示されます。 選択したユーザーのユーザー名をクエリ文字列に渡して、ページへの UserInformation.aspx リンクを含むように GridView を更新しました。 このページには UserInformation.aspx 、選択したユーザーに関する情報と、パスワードを変更するための TextBoxes が表示されます (図 9 を参照)。

新しいパスワードを入力し、2 番目の TextBox で確認し、[ユーザーの更新] ボタンをクリックすると、ポストバックが実行され、ストアド プロシージャが呼び出され aspnet_Membership_SetPassword 、ユーザーのパスワードが更新されます。 この機能に興味を持っている読者には、コードについて理解を深め、パスワードが変更されたユーザーへのメール送信を含むように機能を拡張することをお勧めします。

管理者がユーザーのパスワードを変更する場合がある

図 9: 管理者がユーザーのパスワードを変更する可能性がある (クリックするとフルサイズの画像が表示される)

注意

現在、このページは UserInformation.aspx 、メンバーシップ フレームワークがパスワードをクリア形式またはハッシュ形式で格納するように構成されている場合にのみ機能します。 新しいパスワードを暗号化するコードがありませんが、この機能を追加するように招待されています。 必要なコードを追加することをお勧めする方法は、Reflector などの逆コンパイラを使用して、.NET Framework内のメソッドのソース コードを調べることです。まず、クラスのChangePasswordメソッドをSqlMembershipProvider調べます。 これは、パスワードのハッシュを作成するためのコードを記述するために使用した手法です。

まとめ

ASP.NET には、ユーザーが自分のパスワードを管理するのに役立つ 2 つのコントロールが用意されています。 PasswordRecovery コントロールは、パスワードを忘れたユーザーに役立ちます。 メンバーシップ フレームワークの構成に応じて、ユーザーは既存のパスワードまたはランダムに生成された新しいパスワードを電子メールで送信されます。 ChangePassword コントロールを使用すると、ユーザーは自分のパスワードを更新できます。

Login コントロールや CreateUserWizard コントロールと同様に、PasswordRecovery コントロールと ChangePassword コントロールは、宣言型マークアップやコード行を記述することなく、リッチ なユーザー インターフェイスをレンダリングします。 既定のユーザー インターフェイスがニーズを満たしていない場合は、さまざまなスタイル プロパティを使用してカスタマイズできます。 または、コントロールのインターフェイスをテンプレートに変換して、さらに細かく制御することもできます。 これらのコントロールの背後では、Membership API が使用され、オブジェクトの ResetPassword メソッドと ChangePassword メソッドが呼び出MembershipUserされます。

プログラミングに満足!

もっと読む

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

著者について

複数の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 Scott は、 または mitchell@4guysfromrolla.com のブログから http://ScottOnWriting.NETアクセスできます。

特別な感謝

このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者には、Michael Emmings と Suchi Banerjee が含まれます。 今後の MSDN の記事を確認することに関心がありますか? もしそうなら、私に行を落としてください mitchell@4GuysFromRolla.com