Eメール、SMS送信の設定
パスワードリセット、二要素認証などでEメール、SMSを送信するには、MessageServices.csファイルに定義されたAuthMessageSenderクラスを実装します(リスト4)。
// This class is used by the application to send Email and SMS // when you turn on two-factor authentication in ASP.NET Identity. // For more details see this link http://go.microsoft.com/fwlink/?LinkID=532713 public class AuthMessageSender : IEmailSender, ISmsSender // (1) { public Task SendEmailAsync(string email, string subject, string message) //(2) { // Plug in your email service here to send an email. return Task.FromResult(0); } public Task SendSmsAsync(string number, string message) //(3) { // Plug in your SMS service here to send a text message. return Task.FromResult(0); } } public interface IEmailSender //(4) { Task SendEmailAsync(string email, string subject, string message); } public interface ISmsSender //(5) { Task SendSmsAsync(string number, string message); }
(1)AuthMessageSenderクラスを定義
(4)、(5)の箇所で宣言したIEmailSender、ISmsSenderインターフェースを実装し、AuthMessageSenderクラスを定義します。
(2)メール送信処理を実装
IEmailSender.SendEmailAsyncメソッドを実装し、メール送信処理を行います。本連載の第4回を参考に実装すればよいでしょう。
(3)SMS送信処理を実装
メール送信と同様に、ISmsSender.SendSmsAsyncメソッドを実装します。
Eメール、SMS以外の手段(例えばTwitterのダイレクトメッセージなど)でメッセージを送りたい場合は、IEmailSenderインターフェースなどと同様にIXxxSenderインターフェースを宣言し、AuthMessageSenderクラスに実装すればよいでしょう。
ログイン、ログアウト処理
ログイン、ログアウト処理はAccountControllerクラスに集約されています(リスト5)。
[Authorize] public class AccountController : Controller { private readonly UserManager<ApplicationUser> _userManager; private readonly SignInManager<ApplicationUser> _signInManager; //(1) private readonly IEmailSender _emailSender; private readonly ISmsSender _smsSender; private readonly ApplicationDbContext _applicationDbContext; private static bool _databaseChecked; public AccountController( UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, IEmailSender emailSender, ISmsSender smsSender, ApplicationDbContext applicationDbContext) { _userManager = userManager; _signInManager = signInManager; _emailSender = emailSender; _smsSender = smsSender; _applicationDbContext = applicationDbContext; } // // POST: /Account/Login [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { EnsureDatabaseCreated(_applicationDbContext); ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { // This doesn't count login failures towards account lockout // To enable password failures to trigger account lockout, set lockoutOnFailure: true var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); //(2) if (result.Succeeded) { return RedirectToLocal(returnUrl); } ...(略)... } // If we got this far, something failed, redisplay form return View(model); } ...(略)... // // POST: /Account/LogOff [HttpPost] [ValidateAntiForgeryToken] public IActionResult LogOff() { _signInManager.SignOut(); //(3) return RedirectToAction(nameof(HomeController.Index), "Home"); } ...(略)... }
(1)ログイン/ログアウト処理用フィールドを定義
ログイン/ログアウト処理を委譲するSignInManagerクラスのフィールドを定義します。フィールドの値はコンストラクターで外部から注入します。
(2)ログイン処理
Loginメソッドの中で、SignInManagerクラスのPasswordSignInAsync非同期メソッドを呼び出し、ログイン処理を行います。内部ではユーザー名、パスワードを使ってユーザー情報を取得し、取得したユーザー情報を元に認証チケットを作成してCookieに設定しているのは、従来のASP.NET Identityと変わりません。
(3)ログアウト処理
Logoutメソッドの中で、SignInManagerクラスのSignOutメソッドを呼び出してログアウト処理を行います。内部ではCookieに設定した認証チケットをクリアしています。
その他のユーザー登録処理やパスワードリセットなどの機能についても、すべてAccountControllerに実装例が書かれていますので、興味があればじっくりとコードを見てみるとよいでしょう。また、二要素認証の実装方法など、より詳細な内容は参考資料3)のASP.NET 5公式ドキュメントを参照してみてください。
まとめ
次世代のASP.NET 5におけるASP.NET Identityのポイントを、プレビュー版のテンプレートを元に紹介してきました。今回の内容をまとめると、次のようになります。
-
ASP.NET 5は次のような内容をめざしてオープンソースで開発が進められている
- LinuxやMac OS Xを含むクロスプラットフォーム
- OWINを新たに再実装したミドルウェア、パイプライン処理
- サービス単位でのDI
- 非同期処理
-
ASP.NET Identityの次のバージョン3.0もASP.NET 5本体と同様にオープンソースで開発が進められている
- ASP.NET 5ミドルウェアによるCookie認証
- ASP.NET 5のDIによるASP.NET Identityサービス登録
- Eメール等のメッセージ送信はASP.NET Identityの機能ではなく独自に実装
- テンプレートではAccountController.csにログイン、ログアウトを始めとしたユーザー管理処理が集約されている
さて、第1回から1年以上に渡る本連載も、今回で最終回です。連載ではテンプレートによって生成されたASP.NET Webフォームのコードを中心に説明してきましたが、基本的な概念などはMVC等でも変わりません。実際の製品、システムに組み込むには、テンプレートをそのまま使うわけにはいきませんが、それでもテンプレートから参考にしたり、流用できたりする部分も多いはずです。ぜひご自分が担当するアプリケーションでも、ASP.NET Identityを活用してみてください。
また、今回の記事で紹介したように、次世代のASP.NET 5でもその知識は十分に活用できます。ASP.NET 5は対象範囲も広く、最新情報を追うのが少し大変です。それでも、その中にASP.NET Identityも含まれているということも覚えておき、今後も最新のASP.NET Identityの動向に注目していってください。