SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ASP.NET Identity入門

ASP.NET Identity 2.0の新機能 ~パスワードのリセット

ASP.NET Identity入門 第7回

パスワードのリセット要求ページの変更

 次に、パスワードのリセット要求ページから、パスワードのリセットメールを送信するように変更します。それには、パスワードのリセット要求ページのコメントアウトされたコードを利用します。まずはaspxファイルから見ていきましょう(リスト3)。

リスト3 パスワードのリセット実行ページ(Acount\Forgot.aspxより)
<%-- (1) パスワードリセット用情報入力欄 --%>
<asp:PlaceHolder ID="loginForm" runat="server">
  <div class="form-horizontal">
    <h4>パスワードを忘れた場合</h4>
    <hr />
    <asp:PlaceHolder runat="server" ID="ErrorMessage" Visible="false">
      <p class="text-danger">
        <asp:Literal runat="server" ID="FailureText" />
      </p>
    </asp:PlaceHolder>
    <div class="form-group">
      <asp:Label runat="server" AssociatedControlID="Email"
        CssClass="col-md-2 control-label">電子メール</asp:Label>
      <div class="col-md-10">
        <asp:TextBox runat="server" ID="Email"
          CssClass="form-control" TextMode="Email" />
        <asp:RequiredFieldValidator runat="server" ControlToValidate="Email"
          CssClass="text-danger" ErrorMessage="電子メール フィールドは必須です。" />
      </div>
    </div>
    <div class="form-group">
      <div class="col-md-offset-2 col-md-10">
        <asp:Button runat="server" OnClick="Forgot" Text="送信"
          CssClass="btn btn-default" />
      </div>
    </div>
  </div>
</asp:PlaceHolder>
<%-- (2) パスワードリセットメール送信完了表示欄 --%>
<asp:PlaceHolder runat="server" ID="DisplayEmail" Visible="false">
  <p class="text-info">
    パスワードを再設定するには、メールをご確認ください。
  </p>
</asp:PlaceHolder>
(1)パスワードリセット用情報入力欄

 パスワードリセットを行うためのURLを含んだメールの送り先アドレスを入力します。

(2)パスワードリセットメール送信完了表示欄

 メール送信後にその旨を表示する欄です。したがって、既定では非表示になっています。

 次に分離コード側を見てみましょう(リスト4)。

リスト4 パスワードのリセットメール送信処理(Acount\Forgot.aspx.csより)
protected void Forgot(object sender, EventArgs e)
{
  if (IsValid)
  {
    // (1) ユーザーのメール アドレスを検証
    var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
    ApplicationUser user = manager.FindByName(Email.Text);
    if (user == null || !manager.IsEmailConfirmed(user.Id))
    {
      FailureText.Text = "ユーザーが存在しないか、未確認です。";
      ErrorMessage.Visible = true;
      return;
    }
    // アカウントの確認とパスワードの再設定を有効にする方法については、http://go.microsoft.com/fwlink/?LinkID=320771 を参照してください
    // コードとパスワードの再設定ページへのリダイレクトを記載した電子メールを送信します
    // (2) パスワードリセットトークン生成
    string code = manager.GeneratePasswordResetToken(user.Id);
    // (3) パスワードリセット用URL取得
    string callbackUrl = IdentityHelper.GetResetPasswordRedirectUrl(code, Request);
    // (4) パスワードリセットメール送信
    manager.SendEmail(user.Id, "パスワードのリセット",
      "<a href=\"" + callbackUrl + "\">こちら</a>をクリックして、"
        + "パスワードをリセットしてください.");
    // (5) メール送信後画面表示
    loginForm.Visible = false;
    DisplayEmail.Visible = true;
  }
}
(1)ユーザーのメール アドレスを検証

 パスワードリセット用のURLを含んだメールの宛先として入力されたメールアドレスが、登録済みかどうか、またアカウントの確認も行われているかどうかを検証します。

(2)パスワードリセットトークン生成

 UserManagerクラスのGeneratePasswordResetToken拡張メソッドを使い、登録したユーザーに対する「パスワードリセットトークン」を生成します。このパスワードトークンは、ユーザーID等から生成された英数字や記号が羅列された文字列です。

(3)パスワードリセット用URL取得

 IdentityHelperクラスのGetResetPasswordRediretUrlメソッドを使い、(1)で生成したパスワードリセットトークンを埋め込んだ、パスワードリセットページのURLを生成します。

(4)パスワードリセットメール送信

 (2)で取得したパスワードリセット用URLを埋め込んだ、パスワードリセットメールを送信します。

(5)メール送信後画面表示

 メール送信を行ったことを表すため、「パスワードリセットメール送信完了表示欄」を表示し「パスワードリセット用情報入力欄」を非表示にします。

パスワードリセットページ

 今度は送信したメールに添付したリンクから遷移する、パスワードリセットページを見てみましょう(リスト5)。aspxファイルは特に注意すべき点はないので説明を省きます。

リスト5 パスワードリセットページの分離コード(Account\ResetPassword.aspx.csより)
protected void Reset_Click(object sender, EventArgs e)
{
  // (1) パスワードリセットトークン取得
  string code = IdentityHelper.GetCodeFromRequest(Request);
  if (code != null)
  {
    var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();

    // (2) ユーザー情報取得
    var user = manager.FindByName(Email.Text);
    if (user == null)
    {
      ErrorMessage.Text = "ユーザー名が見つかりません";
      return;
    }

    // (3) パスワードリセット
    var result = manager.ResetPassword(user.Id, code, Password.Text);
    if (result.Succeeded)
    {
      Response.Redirect("~/Account/ResetPasswordConfirmation");
      return;
    }
    ErrorMessage.Text = result.Errors.FirstOrDefault();
    return;
  }

  ErrorMessage.Text = "エラーが発生しました";
}
(1)パスワードリセットトークン取得

 メールのリンクに含めたURLからパスワードリセットトークンの値を取得します。

 パスワードリセットトークンは、アカウントの確認と同様にクエリ文字列のcodeパラメータに設定されており、IdentityHelperクラスのGetCodeFromRequestメソッドを使って取得できます。

(2)ユーザー情報の取得

 パスワードをリセットする対象ユーザー情報を、UserManager<TUser>クラスのFindByName拡張メソッドで取得します。

(3)パスワードリセット

 UserManger<TUser>クラスのResetPassword拡張メソッドを呼び出し、パスワードをリセットします。パスワードリセットに成功すると、パスワードリセット確認画面(Account\ResetPasswordConfirmation.aspx)に遷移します。この画面は単純な画面で、テンプレートで生成されたままで使用しますので、説明は割愛します。

 以上でパスワードのリセットを使用する準備ができました。

次のページ
パスワードのリセットの動作確認

この記事は参考になりましたか?

ASP.NET Identity入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。< WINGSプロジェクト について>有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での 登録メンバ は約50名で、現在も執筆メンバを 募集中 。興味のある方は、どしどし応募頂きたい。 著書 記事 多数。 RSS X: @WingsPro_info (公式)、 @WingsPro_info/wings (メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8254 2014/11/21 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー