SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ASP.NET Identity入門

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

ASP.NET Identity入門 第8回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ログイン画面の実装

 管理画面で二要素認証を有効にすることで、ログイン処理の動作も変わります(リスト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)表示パネル切替

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

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

次のページ
動作確認

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ASP.NET Identity入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8328 2015/01/06 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング