確認メール送信処理
では、実際にアカウントの確認を行うための実装に取り掛かりましょう。まずは、ユーザーの登録処理を行う「登録ページ」を変更します。まず、テンプレートでは登録後にすぐログイン処理も行っていますが、それを削除します。そして、テンプレートではコメントアウトされたコードを利用し、確認メールを送信するように変更します(リスト4)。
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)。なお、このコードはテンプレートで生成されたものにコメントだけ加えたものです。
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メソッドで作成する。
次回は引き続きアカウントの確認処理を実装し、その動作を確認していきます。次回もお楽しみに。