SHOEISHA iD

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

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

ASP.NET Identity入門

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

ASP.NET Identity入門 第8回

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

 今回はメール連携機能紹介の最後として「二要素認証」を紹介します。GoogleやGitHubなどでここ数年の間に相次いで採用された二要素認証も、ASP.NET Identityでは簡単に実装できます。その方法を見ていきましょう。

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

二要素認証とは

 「二要素認証」とは「二段階認証」とも呼ばれ、事前に設定したパスワードによる認証の後に、メール、SMS(ショートメッセージサービス)等で送った一時パスワードでも認証を行う認証方法です。認証に用いる「要素」が事前に設定したパスワードと一時コードの2つであること、認証が二段階になっていることから、このような名前で呼ばれています。

 二要素認証を使うことで、仮になんらかの原因でIDとパスワードが漏れたとしても、一時パスワードが無ければログインできません。また、そのような「攻撃」を受けたことを、一時パスワードを受け取ることで検知することもできるため、よりセキュリティに配慮した認証形式といえます。

 ASP.NET Identityでも、この二要素認証が2.0で追加されました。また、2.1およびVS2013 Update 3以降の標準テンプレートにも組み込まれたため、その導入は比較的容易です。

 それでは、実装の説明に入る前に、ASP.NET Identityの二要素認証の動作イメージについて図1を使って説明します。

図1 二要素認証の動作イメージ
図1 二要素認証の動作イメージ

1. ログイン処理

 ユーザー登録時、または管理画面から設定したパスワードにより、ログインを行います。すると、二要素認証のための「確認コード」を送信させるための画面に遷移します。ASP.NET Identityでは、二要素認証に使う一時パスワードを「確認コード(Verify Code)」と呼びます。

2. 確認コード送信

 確認コード送信画面では、送信先をメール/SMSから選択して確認コードを送信します。送信先のメールアドレスは、ユーザー登録時に指定したメールアドレスであるため、二要素認証はアカウントの確認が有効であることが前提となります。

 確認コードを送信した後は、送信した確認コードを入力するための画面が表示されます。

3. 確認コード入力

 メールやSMSで送られた確認コード(6桁の数字)を入力します。そして、入力された確認コードが妥当なものであれば、ユーザーの認証が完了し、ログイン後の画面に遷移します。

 なお、本連載の中で前回までは「二段階認証」と呼んでいました。しかし、VS2013 Update 3のテンプレートでは「2要素認証」と表記しているため、今後は「二要素認証」の呼称で統一します。

管理画面の実装

 それでは実際に二要素認証を用いたアプリケーションを作成していきましょう。二要素認証でもメールを利用しますので、まずは新たにWebフォームアプリケーションを作成した後、前回と同様に本連載の第5回第6回を参考に、メールを送信できるように設定しておいてください。

 最初はユーザーが二要素認証を有効にするために、「管理画面(Acount¥Manage.aspx(.cs))」に変更を加えます。

 まず、aspxファイルは「電話番号は 2 要素認証システムで第 2 の確認要素として使用できます。」というコメントの下にあるコメントアウト箇所をすべて解除してください。 次に、分離コードを見てみましょう。最初はPage.Loadイベントハンドラーです(リスト1)。

リスト1 管理画面のPage.Loadイベントハンドラーより(Acount\Manage.aspx.csより)
//(1)携帯電話番号有無判定
HasPhoneNumber = String.IsNullOrEmpty(manager.GetPhoneNumber(User.Identity.GetUserId()));

//(2)携帯電話番号表示
PhoneNumber.Text = manager.GetPhoneNumber(User.Identity.GetUserId()) ?? String.Empty;

//(3)二要素認証有効判定
TwoFactorEnabled = manager.GetTwoFactorEnabled(User.Identity.GetUserId());
(1)携帯電話番号有無判定

 電話画面の表示を制御するためのHasPhoneNumberプロパティに、UserManger<T>クラスのGetPhoneNumber拡張メソッドを使い、携帯電話番号が設定されているかどうかを設定します。

(2)携帯電話番号表示

 (1)と同じくGetPhoneNumber拡張メソッドで携帯電話番号を取得し、画面に表示します。

 なお、テンプレートで生成されたコードではこの部分がコメントアウトされていますので、コメントを解除するだけで良いです。

(3)二要素認証有効判定

 二要素認証の有効/無効を切り替える項目の表示制御のため、TowFactorEnabledプロパティにUserManager<T>クラスのGetTwoFactorEnabled拡張メソッドを呼び出し、二要素認証が有効かどうかを設定します。

 次に二要素認証を有効にする処理を見てみましょう(リスト2)。

リスト2 管理画面の二要素認証有効化処理(Acount\Manage.aspx.csより)
//EnableTwoFactorAuthentication
protected void TwoFactorEnable_Click(object sender, EventArgs e)
{
  var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
  // 二要素認証の有効化
  manager.SetTwoFactorEnabled(User.Identity.GetUserId(), true);

  Response.Redirect("/Account/Manage");
}

 太字の箇所のように、UserManager<T>クラスのSetTwoFactorEnabled拡張メソッドの第二引数にtrueを渡して呼び出すことで、二要素認証を有効にします。内部ではDBのユーザー情報テーブル(AspNetUserテーブル)のTwoFactorEnabled列にTrueが設定されます。

 なお、二要素認証を無効化するコードもテンプレートに含まれますが、その実装は上記メソッドの引数がfalseになるだけです。

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
ログイン画面の実装

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

  • このエントリーをはてなブックマークに追加
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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング