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

作成者: Scott Mitchell

注意

この記事が作成されて以来、ASP.NET メンバーシップ プロバイダーは ASP.NET Identity に置き換えられました。 この記事の執筆時点で取り上げられたメンバーシップ プロバイダーではなく 、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 - 訪問者にユーザー名の入力を求めます。 これが最初のビューです。
  • 質問 - ユーザーのユーザー名とセキュリティの質問をテキストとして表示し、ユーザーがセキュリティの質問に対する回答を入力するためのテキスト ボックスと共に表示します。
  • 成功 - パスワードが電子メールで送信されたことをユーザーに通知するメッセージが表示されます。

表示されるビューと 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: PasswordRecovery RequiresQuestionAndAnswerコントロールの外観と動作に影響を与える 、 EnablePasswordRetrieval、および EnablePasswordReset (フルサイズの画像を表示する をクリックします)

注意

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、および validation コントロールを含む豊富な複合インターフェイスをレンダリングします。 コントロールのスタイル プロパティを使用するか、ビューをテンプレートに変換することで、ビューの外観をカスタマイズできます。 興味のある読者のための演習としてこれを残します。

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

このページをテストする前に、 でメール配信設定 Web.configを指定する必要がある構成の最後の部分が 1 つあります。 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 を参照)。 メッセージは、件名 Password とプレーンテキスト本文を <smtp> 使用して、 要素の from 属性で指定されたアカウントから送信されます。

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

ユーザー名: username

パスワード: password

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

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

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

protected void RecoverPwd_SendingMail(object sender, MailMessageEventArgs e)
{
    e.Message.CC.Add("webmaster@example.com");
}

電子メール メッセージは、宣言型の手段を使用して構成することもできます。 PasswordRecovery の MailDefinition プロパティは、 型 MailDefinitionのオブジェクトです。 クラスはMailDefinitionSubjectBodyFileNameFromCCPriorityIsBodyHtmlなどの電子メール関連のプロパティのホストを提供します。 まず、 プロパティを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 で、件名と本文が更新されていることに注意してください。

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

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

HTML 形式の電子メールを True (既定値は False) に設定 IsBodyHtml して送信し、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 つのパラメーターの値は Membership の構成 MinRequiredPasswordLengthMinRequiredNonalphanumericCharacters プロパティによって決まります。この値はそれぞれ 7 と 1 に設定されています。

メソッドは 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 プロパティの BodyFileNameIsBodyHtml、および Subject プロパティをそれぞれ ~/EmailTemplates/ChangePassword.htm、True、および Your password has changed!に設定します。

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

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

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

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

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

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

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

MembershipUser usr = Membership.GetUser(username);
string resetPwd = 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記述しました。

注意

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

コードには魅力的でないビットがいくつかあり、非常に長いです。 したがって、このチュートリアルを詳しく調べることで煩雑にしたくないのです。 詳細については、このチュートリアルのコードをダウンロードし、ページにアクセスしてください ~/Administration/ManageUsers.aspx前のチュートリアル作成したこのページには、各ユーザーの一覧が表示されます。 選択したユーザーのユーザー名をクエリ文字列に渡して、ページへの UserInformation.aspx リンクを含むように GridView を更新しました。 ページには UserInformation.aspx 、選択したユーザーと、パスワードを変更するための TextBox に関する情報が表示されます (図 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 は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 Scott は、 または mitchell@4guysfromrolla.com のブログを http://ScottOnWriting.NET介してアクセスできます。

特別な感謝

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