SHOEISHA iD

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

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

ASP.NET Identity入門

ASP.NET Identity 2.0の新機能
~メールを使ったアカウントの確認

ASP.NET Identity入門 第6回

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

補足:ASP.NET Identity 2.1、Visual Studio 2013 Update 3の新機能
~SignInManagerクラス

 前回も簡単に触れましたが、ASP.NET Identity 2.1、Visual Studio 2013 Update 3にはいくつか新機能が追加されています。その中で一番大きいものがSignInManagerクラスの導入です。

 Identity 2.0までのログイン処理では、ユーザーとパスワードといった認証情報の妥当性の確認はIdentityで、実際のログイン処理(ログインしたという状態を保存する処理)はOwinで行う必要があり、少しわかりにくいです(第2回記事を参照)。また、アカウントロックアウト機能も、ロック状態の確認処理、認証失敗処理を自分で追加してやらないといけないため、少々手間でした(第4回記事を参照)。

 こういった問題を解消するため、Identity 2.1では「SignInManager<TUser, TKey>クラス」が導入されました。また、同時にリリースされたVisual Studio 2013 Update 3にSignInManager<TUser, TKey>クラスを用いたテンプレートが採用されました。

 SignInManagerクラスを使うことで、Login.aspx.csファイルに記載されたログイン処理が、非常にシンプルになります(リスト4)。

リスト4 SignInManagerクラスを用いたログイン処理(Account\Login.aspx.csファイルより)
//(1)SignInMangerクラスのインスタンス取得
var signinManager = Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();

//(2)パスワードによるログイン処理
// ここではアカウントのロックアウトを目的としてログイン エラーが考慮されません
// パスワード エラーによってロックアウトが実行されるようにするには、shouldLockout: true に変更します
var result = signinManager.PasswordSignIn(Email.Text, Password.Text, RememberMe.Checked, shouldLockout: false);

//(3)ログイン処理結果判定
switch (result)
{
  //(4)ログイン成功
  case SignInStatus.Success:
    IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
    break;
  //(5)アカウントロックアウト
  case SignInStatus.LockedOut:
    Response.Redirect("/Account/Lockout");
    break;
  //(6)2段階認証による検証が必要
  case SignInStatus.RequiresVerification:
    Response.Redirect(String.Format("/Account/TwoFactorAuthenticationSignIn?ReturnUrl={0}&RememberMe={1}",
                                    Request.QueryString["ReturnUrl"],
                                    RememberMe.Checked),
                      true);
    break;
  //(7)ログイン失敗
  case SignInStatus.Failure:
  default:
    FailureText.Text = "無効なログインです";
    ErrorMessage.Visible = true;
    break;
}
(1) SignInManagerクラスのインスタンス取得

 リストのようなコードでSignInManagerクラスのインスタンスが取得できます。このコードについては「おまじない」として覚えておいてよいでしょう。詳細を知りたい方は、App_Start\Startup.Auth.csファイルに定義されたStartupクラスのConfigureAuthメソッド付近を参照してみてください。

(2) パスワードによるログイン処理

 SignInManagerクラスのPasswordSignIn拡張メソッドを呼び出し、パスワードを用いたログイン処理を行います。なお、このメソッドの最後の引数shouldLockoutにtrueを指定することで、コメントに書いてある通りロックアウト処理が有効になります。

(3) ログイン処理結果判定

 SignInManagerクラスのPasswordSignIn拡張メソッドの戻り値(SignInStatus列挙型)を判定することで、ログイン処理の結果がわかります。

(4) ログイン成功

 戻り値がSuccessの場合、ログインに成功しています。テンプレートのコードでは、ログイン画面への遷移元画面に戻リます。

(5) アカウントロックアウト

 戻り値がLockedOutの場合、規定回数パスワードチェックに失敗したため、アカウントがロックアウトされています。テンプレートでは、ロックアウトを知らせるページに遷移します。

(6) 2段階認証による検証が必要

 詳しくはこの連載の中で後ほど紹介しますが、ASP.NET Identityは「2段階認証」という認証方法もサポートしており、戻り値がRequiresVerificationの場合、その二段階認証による認証も必要ということを表しています。テンプレートでは二段階認証用のページに遷移します。

(7) 認証失敗

 戻り値がFailureの場合、パスワードを使ったログイン処理に失敗しています。テンプレートでは認証に失敗した旨のメッセージを表示しています。また、SignInManager列挙型で想定していない値だった場合も、ログイン処理に失敗したとみなします。

 なお、SignInManagerにはパスワード認証以外の認証方法についても、対応する専用メソッドが用意されています。詳しくは本連載のこの後の回で、その機能を紹介するときに合わせて説明します。

まとめ

 今回はASP.NET Identity 2.0の新機能の「アカウントの確認」について、メールに添付したURLで開く確認処理から紹介しました。まとめると次のようになります。

  • 確認ページでは、確認メールに添付した確認トークンを検証する
    • 確認トークンの検証には、UserManager<TUser>クラスのConfirmEmail拡張メソッドを使用する
    • 確認トークンがない、もしくは不正な場合、アカウントの確認に失敗する
  • ログインページでは、未確認のユーザーはブロックする
    • 確認済みかどうかは、UserManager<TUser>クラスのIsEmailConfirmed拡張メソッドを使用する
  • Identity 2.1では、ログイン処理の煩雑さを軽減するためSignInManagerクラスが導入された
    • ログイン処理の煩雑さを軽減できる
    • VS2013 Update 3に対応したテンプレートが組み込まれた

 次回は「アカウントの確認」と同じようにメールと連携する機能である「パスワードのリセット」を紹介する予定です。お楽しみに。

参考資料

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

  • 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/8181 2014/10/17 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング