CodeZine(コードジン)

特集ページ一覧

ASP.NET Identity 2.0の新機能
~二要素認証

ASP.NET Identity入門 第8回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2015/01/06 14:00
目次

ログイン画面の実装

 管理画面で二要素認証を有効にすることで、ログイン処理の動作も変わります(リスト3)。

リスト3 ログイン処理(Acount\Login.aspx.csのLoginメソッドより)
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)。

リスト4 二要素認証画面(Acount\TwoFactorAuthenticationSignIn.aspxより)
<%--(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)。

リスト5 二要素認証画面の分離コード(Acount\TwoFactorAuthenticationSignIn.aspx.csより)
//(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)表示パネル切替

 確認コード送信パネルを非表示、確認コード入力パネルを表示します。

 以上で二要素認証の実装は終了です。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:ASP.NET Identity入門

もっと読む

著者プロフィール

  • WINGSプロジェクト 高野 将(タカノ ショウ)

    <個人紹介> 新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5