ログイン画面の実装
管理画面で二要素認証を有効にすることで、ログイン処理の動作も変わります(リスト3)。
var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false); switch (result) { …(略)… case SignInStatus.RequiresVerification: // 二要素認証による確認 Response.Redirect(String.Format("/Account/TwoFactorAuthenticationSignIn?ReturnUrl={0}&RememberMe={1}", Request.QueryString["ReturnUrl"], RememberMe.Checked), true); break; …(略)… }
管理画面で二要素認証を有効にすると、ユーザーとパスワードの認証に成功したときのSignInManagerクラスのPasswordSignIn拡張メソッドの戻り値が、太字の箇所の「RequiresVerification」になり、パスワード認証後に二要素認証画面に遷移します。
二要素認証画面の実装
ログイン処理から遷移する二要素認証画面の実装を見ていきましょう。まずはaspxファイルです(リスト4)。
<%--(1)確認コード送信用パネル --%> <asp:PlaceHolder runat="server" ID="sendcode"> <section> <h4>確認コードを送信する</h4> <hr /> <div class="row"> <div class="col-md-12"> 2 要素認証プロバイダーを選択する: <asp:DropDownList runat="server" ID="Providers"> </asp:DropDownList> <asp:Button Text="送信" ID="ProviderSubmit" OnClick="ProviderSubmit_Click" CssClass="btn btn-default" runat="server" /> </section> </asp:PlaceHolder> <%--(2)確認コード入力用パネル --%> <asp:PlaceHolder runat="server" ID="verifycode" Visible="false"> <section> <h4>確認コードを入力する</h4> …(略)… </section> </asp:PlaceHolder>
(1)確認コード送信用パネル
二要素認証画面に遷移後、最初に表示されるのが確認コード送信用パネルです。確認コードの送信先を選んで確認コードを送信させるための項目が定義されています。
(2)確認コード入力用パネル
(1)のパネルで確認コードを送信後に表示されるパネルです。したがって、PlaceHolderコントロールのVisibleプロパティはfalseを設定し、分離コードで制御します。
次に分離コードです(リスト5)。
//(1)確認コード入力処理 protected void CodeSubmit_Click(object sender, EventArgs e) { bool rememberMe = false; bool.TryParse(Request.QueryString["RememberMe"], out rememberMe); //(2)確認コードの検証 var result = signinManager.TwoFactorSignIn<ApplicationUser, string>(SelectedProvider.Value, Code.Text, isPersistent: rememberMe, rememberBrowser: RememberBrowser.Checked); switch (result) { case SignInStatus.Success: IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response); break; case SignInStatus.LockedOut: Response.Redirect("/Account/Lockout"); break; case SignInStatus.Failure: default: FailureText.Text = "無効なコード"; ErrorMessage.Visible = true; break; } } //(3)確認コード送信処理 protected void ProviderSubmit_Click(object sender, EventArgs e) { //(4)確認コード送付 if (!signinManager.SendTwoFactorCode(Providers.SelectedValue)) { Response.Redirect("/Account/Error"); } //(5)確認コード生成処理の削除 //var user = manager.FindById(signinManager.GetVerifiedUserId<ApplicationUser, string>()); //if (user != null) //{ // var code = manager.GenerateTwoFactorToken(user.Id, Providers.SelectedValue); //} SelectedProvider.Value = Providers.SelectedValue; //(6)表示パネル切替 sendcode.Visible = false; verifycode.Visible = true; }
(1)確認コード入力処理
確認コード入力パネルの送信ボタンをクリックすると実行されます。
(2)確認コードの検証
SignInManagerクラスのTwoFactorSignIn拡張メソッドを呼び出し、確認コードの検証を行います。メール等で送信した確認コードと同じ値を入力された場合、戻り値がSuccessになり、二要素認証に成功します。
(3)確認コード送信処理
確認コード送信パネルの送信ボタンをクリックすると実行されます。
(4)確認コード送付
SignInManagerクラスのSendTwoFactorCode拡張メソッドを呼び出し、確認コードを選択した送信先に送信します。
(5)確認コード生成処理の削除
テンプレートでは生成されますが、このコードはSignInManagerの導入により不要になったため、削除します。
(6)表示パネル切替
確認コード送信パネルを非表示、確認コード入力パネルを表示します。
以上で二要素認証の実装は終了です。