SHOEISHA iD

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

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

ASP.NET Identity入門

ASP.NET Identity 2.0の新機能
~メール連携機能のためのメール送信処理

ASP.NET Identity入門 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

確認メール送信処理

 では、実際にアカウントの確認を行うための実装に取り掛かりましょう。まずは、ユーザーの登録処理を行う「登録ページ」を変更します。まず、テンプレートでは登録後にすぐログイン処理も行っていますが、それを削除します。そして、テンプレートではコメントアウトされたコードを利用し、確認メールを送信するように変更します(リスト4)。

リスト4 確認メール送信処理(Account\Register.aspx.csより)
protected void CreateUser_Click(object sender, EventArgs e)
{
  var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
  var user = new ApplicationUser() { UserName = Email.Text, Email = Email.Text };
  IdentityResult result = manager.Create(user, Password.Text);
  if (result.Succeeded)
  {
    // アカウントの確認とパスワードの再設定を有効にする方法については、http://go.microsoft.com/fwlink/?LinkID=320771 を参照してください
    // (1)確認トークン生成
    string code = manager.GenerateEmailConfirmationToken(user.Id);
    // (2)アカウント確認用URL取得
    string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request);
    // (3)確認メール送信
    manager.SendEmail(user.Id, "アカウントの確認",
      "このリンクをクリックすることによってアカウントを確認してください "
      + "<a href=\"" + callbackUrl + "\">こちら</a>.");

    // (4)サインイン処理削除
    //IdentityHelper.SignIn(manager, user, isPersistent: false);

    // (5)確認メール送信後ページに遷移
    IdentityHelper.RedirectToReturnUrl("~/Account/ConfirmationEmailSent", Response);
  }
  else
  {
    ErrorMessage.Text = result.Errors.FirstOrDefault();
  }
(1)確認トークン生成

 UserManagerクラスに用意されたGenerateEmailConfirmationTokenメソッドを使い、登録したユーザーに対する「確認トークン」を生成します。この確認トークンはユーザーID等から生成された英数字や記号が羅列された文字列です。後ほど確認ページにおいて、この確認トークンを検証します。

(2)アカウント確認用URL取得

 IdentityHelperクラスのGetUserConfirmationRediretUrlメソッドを使い、メールに埋め込むためのアカウント確認用URLを生成します。この処理はテンプレートで生成されたコードではコメントアウトされているので、コメントアウトを解除します。

(3)確認メール送信

 (2)で取得したアカウント確認用URLをリンクとして本文に埋め込んだ確認メールを送信します。メールの送信はUserManager<TUser>クラスのSendEmail拡張メソッドを使います。この処理も生成されたコードのコメントアウトを解除します。

(4)サインイン処理削除

 テンプレートで生成されたサインイン処理を削除します。削除しないとアカウントの確認を行う前に、登録後に自動的にログイン状態になってしまうためです。

(5)確認メール送信後ページ遷移

 テンプレートをそのまま使うと、ユーザー登録を行って確認メールを送った後、また登録画面が表示されてしまいます。これでは確認メールが送信されたかどうかがわかりにくいため、今回はメールが送られたことをユーザーに明示するために、専用の「確認メール送信後ページ(Account\ConfirmationEmailSent.aspx)」を新たに作成し、そちらに遷移するように変更します。

 なお、確認メール送信後ページはシンプルな画面ですので、詳細はサンプルを確認してください。

 (2)で呼び出しているIdentityHelper.GetUserConfirmationRedirectUrlメソッドの実装も見てみましょう(リスト5)。なお、このコードはテンプレートで生成されたものにコメントだけ加えたものです。

リスト5 アカウントの確認用URLの取得(Models\IdentityModels.csのIdentityHelperクラスより抜粋)
public static string GetUserConfirmationRedirectUrl(string code, string userId)
{
  // (1)アカウント確認用URL作成
  var absoluteUri = "/Account/Confirm?" + CodeKey + "=" + HttpUtility.UrlEncode(code)
    + "&" + UserIdKey + "=" + HttpUtility.UrlEncode(userId);
  // (2)現在のサイトの基底URLを付加して返却
  return new Uri(request.Url, absoluteUri).AbsoluteUri.ToString();
}
(1)アカウントの確認用URL作成

 確認ページのパスにクエリパラメータとして確認トークン、ユーザーIDを設定したURLを作成します。

(2)現在のサイトの基底URLを付加して返却

 (1)で作成したURLは基底URLがないため、現在のサイトの基底URLを先頭に付加してから返却します。

 以上で確認メールが送信されるようになりました。

まとめ

 今回はASP.NET Identity 2.0の新機能であるメールと連携する機能のうち、「アカウントの確認」の動作原理とメールの送信処理、確認メール送信処理の実装例を紹介しました。まとめると次のようになります。

  • ASP.NET Identity 2.0にはメールと連携する機能が追加された。
    • アカウントの確認
    • パスワードのリセット
    • 二段階認証
  • 「アカウントの確認」は登録されたユーザーの正当性を確認するために、確認メールを送信する機能である。
  • メールの送信はUserManager<TUser>クラスのEmailServiceプロパティに設定するIIdentityMesasgeServiceインターフェースの実装クラスで行う。
    • IIdentityMessageSeriveインターフェースはメールだけでなくSMS等の送信処理でも使われる。
    • テンプレートではIIdentityMessageServiceインターフェースを実装したEmailServiceクラスの骨組が生成される。
    • クラウドメールサービスの「SendGrid」を使うと、専用のメール送信APIを含むライブラリをNuGetからインストールして使用できる。
  • 登録ページではサインイン処理を削除し、アカウントの確認メールを送信する。
    • メール送信はUserManager<TUser>クラスのSendEmail拡張メソッドを使用する。
    • メールには「確認トークン」を含んだリンクを添付する。
    • 添付するリンクのURLはIdentityHelperクラスのGetUserConfirmationRedirectUrlメソッドで作成する。

 次回は引き続きアカウントの確認処理を実装し、その動作を確認していきます。次回もお楽しみに。

参考資料

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8047 2014/09/18 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング