二要素認証とは
「二要素認証」とは「二段階認証」とも呼ばれ、事前に設定したパスワードによる認証の後に、メール、SMS(ショートメッセージサービス)等で送った一時パスワードでも認証を行う認証方法です。認証に用いる「要素」が事前に設定したパスワードと一時コードの2つであること、認証が二段階になっていることから、このような名前で呼ばれています。
二要素認証を使うことで、仮になんらかの原因でIDとパスワードが漏れたとしても、一時パスワードが無ければログインできません。また、そのような「攻撃」を受けたことを、一時パスワードを受け取ることで検知することもできるため、よりセキュリティに配慮した認証形式といえます。
ASP.NET Identityでも、この二要素認証が2.0で追加されました。また、2.1およびVS2013 Update 3以降の標準テンプレートにも組み込まれたため、その導入は比較的容易です。
それでは、実装の説明に入る前に、ASP.NET Identityの二要素認証の動作イメージについて図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)携帯電話番号有無判定 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)。
//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になるだけです。