SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

ASP.NET Identity入門

ASP.NET Identity 2.0の新機能
~ログインに関する検証強化とアカウントロックアウト

ASP.NET Identity入門 第4回

パスワードの検証強化

 ASP.NET Identity 1.0では、ユーザー登録時に設定するパスワードの妥当性は、標準では文字長しかチェックされませんでした。ASP.NET Identity 2.0では、新たにMicrosoft.AspNet.Identity.PasswordValidatorクラスが追加され、さまざまなチェックを行えるようになりました。

 PasswordValidatorクラスはUserValidator<TUser>クラスと同じく、IIdentityValidator<T>クラスの派生クラスです。ユーザー名のチェック方法指定と同様に、IdentityConfig.csファイルに定義されたApplicationUserクラスのCreateメソッドで、UserManagerクラスのPasswordValidatorプロパティに設定されます(リスト3)。

リスト3 パスワードのチェック方法指定(App_Start¥IdentityConfig.cs)
public class ApplicationUserManager : UserManager<ApplicationUser>
{
  public ApplicationUserManager(IUserStore<ApplicationUser> store)
    : base(store)
  {
  }

  public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
  {
    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

    ...

    // パスワードの検証ロジックを設定します
    manager.PasswordValidator = new PasswordValidator
    {
      RequiredLength = 6,
      RequireNonLetterOrDigit = true,
      RequireDigit = true,
      RequireLowercase = true,
      RequireUppercase = true,
    };
   
  }
}

 PassworkValidatorクラスでは、どのようなパスワードを有効とみなすかをプロパティで設定できます(表3)。例えば、パスワードに大文字英字を使わなくてもよいようにするのなら、RequireUppercaseプロパティにfalseを設定します。

表3 UserValidator<TUser>クラスのプロパティ
プロパティ名 説明
RequiredLength パスワードに必要な桁数を指定する
RequireNonLetterOrDigit アルファベットでも数字でもない値が必要かどうかを指定する
RequireDigit 数字が必要かどうかを指定する
RequireLowercase 小文字英字が必要かどうかを指定する
RequireUppercase 大文字英字が必要かどうかを指定する

アカウントのロックアウト

 ASP.NET Identity 2.0には、ログイン時に既定回数パスワードを間違えると、しばらくアカウントをロックしてログインできなくする、いわゆる「ロックアウト」機能が追加されました。ただし、テンプレートで生成されたコードにはこの機能は含まれていないため、自分で追加実装する必要があります。ロックアウトを実装するには、次の2つの手順が必要です。

  1. UserManagerオブジェクトへのプロパティ設定
  2. ログイン画面へのロックアウト処理の追加

 実装方法を、順に見ていきましょう。

UserManagerオブジェクトへのプロパティ設定

 ロックアウトを有効にするには、これまでにも出てきたApp_Start¥IdentityConfig.csファイル内のApplicationUserManager.Createメソッドに、ロックアウト機能を使用するためのプロパティ設定を追加します(リスト4)。

リスト4 アカウントロックアウト設定(App_Start¥IdentityConfig.cs)
public class ApplicationUserManager : UserManager<ApplicationUser>
{
  public ApplicationUserManager(IUserStore<ApplicationUser> store)
    : base(store)
  {
  }

  public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
  {
    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

    …(略)….

    // アカウントロックアウト設定``
    manager.UserLockoutEnabledByDefault = true;
    manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
    manager.MaxFailedAccessAttemptsBeforeLockout = 5;
    return manager;
  }
}

 設定しているプロパティについて、表4にまとめます。これらのプロパティを設定することで、アカウントロックアウト機能を使用する準備を行います。サンプルではロックアウト時間5分、ロックアウトされるまでの試行回数を5回に設定しています。

表4 アカウントロックアウトに関連したUserManager<TUser>クラスのプロパティ
プロパティ名 説明
UserLockoutEnabledByDefault 登録するユーザーが既定でロックアウトを有効にするかどうか指定する(AspNetUsersテーブルのLockoutEnabled列に設定される)
DefaultAccountLockoutTimeSpan アカウントがロックアウトされる時間を指定する
MaxFailedAccessAttemptsBeforeLockout アカウントがロックアウトされるまでの試行回数を指定する

ログイン画面へのロックアウト処理の追加

 次に、ロックアウト処理をログイン画面に組み込みます。そのためには、Account¥Login.aspx.csファイルのLogInメソッドを、テンプレートのコードから大幅に変更します(リスト5)。

リスト5 ロックアウト処理組み込み(Account¥Login.aspx.cs)
protected void LogIn(object sender, EventArgs e)
{
  if (IsValid)
  {
    // ユーザーのパスワードを検証します
    var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();

    var signedIn = false;

    var user = manager.FindByName(Email.Text);  //(1)

    if (user != null)
    {
      if (manager.IsLockedOut(user.Id))   // (2)
      {
        // ユーザーがロックアウトされている
        FailureText.Text = "ユーザーがロックアウトされています。しばらく待ってから再度ログインしてください。";
        ErrorMessage.Visible = true;
        return;
      }

      if (manager.CheckPassword(user, Password.Text))   // (3)
      {
        // パスワードが有効
        signedIn = true;
      }
      else
      {
        // パスワードが無効
        manager.AccessFailed(user.Id);  //(4)
      }
    }

    if (signedIn)
    {
      IdentityHelper.SignIn(manager, user, RememberMe.Checked);
      IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
    }
    else
    {
      FailureText.Text = "ユーザー名またはパスワードが無効です。";
      ErrorMessage.Visible = true;
    }
  }
}
(1)ユーザー名でユーザーを取得する

 ロックアウトされたユーザーかどうかを最初に確認するため、まずパスワードを使わずにユーザー情報を取得します。ユーザー情報が取得できなければ、そのままログオン失敗とします。

(2)ロックアウトされたユーザーかどうか確認する

 UserManager<TUser>クラスのIsLockedOutメソッドを使い、ロックアウトされたユーザーかどうか確認します。ロックアウトされていればエラーメッセージを表示して、ログイン処理を中断します。

(3)パスワードをチェックする

 UserManager<TUser>クラスのCheckPasswordメソッドを使い、入力したパスワードが有効かどうかチェックします。パスワードが有効なら、ログオン成功とします。

(4)ログオン失敗処理

 パスワードが無効な場合、ロックアウトのためのログオン失敗回数を更新するため、UserManager<TUser>クラスのAccessFailedメソッドを呼び出します。

次のページ
まとめ

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

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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7921 2014/08/06 14:00

イベント

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

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

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

メールバックナンバー