補足:ASP.NET Identity 2.1、Visual Studio 2013 Update 3の新機能
~SignInManagerクラス
前回も簡単に触れましたが、ASP.NET Identity 2.1、Visual Studio 2013 Update 3にはいくつか新機能が追加されています。その中で一番大きいものがSignInManagerクラスの導入です。
Identity 2.0までのログイン処理では、ユーザーとパスワードといった認証情報の妥当性の確認はIdentityで、実際のログイン処理(ログインしたという状態を保存する処理)はOwinで行う必要があり、少しわかりにくいです(第2回記事を参照)。また、アカウントロックアウト機能も、ロック状態の確認処理、認証失敗処理を自分で追加してやらないといけないため、少々手間でした(第4回記事を参照)。
こういった問題を解消するため、Identity 2.1では「SignInManager<TUser, TKey>クラス」が導入されました。また、同時にリリースされたVisual Studio 2013 Update 3にSignInManager<TUser, TKey>クラスを用いたテンプレートが採用されました。
SignInManagerクラスを使うことで、Login.aspx.csファイルに記載されたログイン処理が、非常にシンプルになります(リスト4)。
//(1)SignInMangerクラスのインスタンス取得 var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>(); //(2)パスワードによるログイン処理 // ここではアカウントのロックアウトを目的としてログイン エラーが考慮されません // パスワード エラーによってロックアウトが実行されるようにするには、shouldLockout: true に変更します var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false); //(3)ログイン処理結果判定 switch (result) { //(4)ログイン成功 case SignInStatus.Success: IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response); break; //(5)アカウントロックアウト case SignInStatus.LockedOut: Response.Redirect("/Account/Lockout"); break; //(6)2段階認証による検証が必要 case SignInStatus.RequiresVerification: Response.Redirect(String.Format("/Account/TwoFactorAuthenticationSignIn?ReturnUrl={0}&RememberMe={1}", Request.QueryString["ReturnUrl"], RememberMe.Checked), true); break; //(7)ログイン失敗 case SignInStatus.Failure: default: FailureText.Text = "無効なログインです"; ErrorMessage.Visible = true; break; }
(1) SignInManagerクラスのインスタンス取得
リストのようなコードでSignInManagerクラスのインスタンスが取得できます。このコードについては「おまじない」として覚えておいてよいでしょう。詳細を知りたい方は、App_Start\Startup.Auth.csファイルに定義されたStartupクラスのConfigureAuthメソッド付近を参照してみてください。
(2) パスワードによるログイン処理
SignInManagerクラスのPasswordSignIn拡張メソッドを呼び出し、パスワードを用いたログイン処理を行います。なお、このメソッドの最後の引数shouldLockoutにtrueを指定することで、コメントに書いてある通りロックアウト処理が有効になります。
(3) ログイン処理結果判定
SignInManagerクラスのPasswordSignIn拡張メソッドの戻り値(SignInStatus列挙型)を判定することで、ログイン処理の結果がわかります。
(4) ログイン成功
戻り値がSuccessの場合、ログインに成功しています。テンプレートのコードでは、ログイン画面への遷移元画面に戻リます。
(5) アカウントロックアウト
戻り値がLockedOutの場合、規定回数パスワードチェックに失敗したため、アカウントがロックアウトされています。テンプレートでは、ロックアウトを知らせるページに遷移します。
(6) 2段階認証による検証が必要
詳しくはこの連載の中で後ほど紹介しますが、ASP.NET Identityは「2段階認証」という認証方法もサポートしており、戻り値がRequiresVerificationの場合、その二段階認証による認証も必要ということを表しています。テンプレートでは二段階認証用のページに遷移します。
(7) 認証失敗
戻り値がFailureの場合、パスワードを使ったログイン処理に失敗しています。テンプレートでは認証に失敗した旨のメッセージを表示しています。また、SignInManager列挙型で想定していない値だった場合も、ログイン処理に失敗したとみなします。
なお、SignInManagerにはパスワード認証以外の認証方法についても、対応する専用メソッドが用意されています。詳しくは本連載のこの後の回で、その機能を紹介するときに合わせて説明します。
まとめ
今回はASP.NET Identity 2.0の新機能の「アカウントの確認」について、メールに添付したURLで開く確認処理から紹介しました。まとめると次のようになります。
-
確認ページでは、確認メールに添付した確認トークンを検証する
- 確認トークンの検証には、UserManager<TUser>クラスのConfirmEmail拡張メソッドを使用する
- 確認トークンがない、もしくは不正な場合、アカウントの確認に失敗する
-
ログインページでは、未確認のユーザーはブロックする
- 確認済みかどうかは、UserManager<TUser>クラスのIsEmailConfirmed拡張メソッドを使用する
-
Identity 2.1では、ログイン処理の煩雑さを軽減するためSignInManagerクラスが導入された
- ログイン処理の煩雑さを軽減できる
- VS2013 Update 3に対応したテンプレートが組み込まれた
次回は「アカウントの確認」と同じようにメールと連携する機能である「パスワードのリセット」を紹介する予定です。お楽しみに。