補足: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に対応したテンプレートが組み込まれた
次回は「アカウントの確認」と同じようにメールと連携する機能である「パスワードのリセット」を紹介する予定です。お楽しみに。
