ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の7回目です。前回は、ロール管理を使ってみました。今回はユーザアカウントロックを使ってみます。ログイン時に規定の回数パスワードを間違えたら、一定の時間ログイン出来ない(ユーザアカウントロック)状態にするテストをします。今回も主に、ApplicationUserManagerクラスを利用します。
今回のソース一式はこちらです。今回の部分は(ISY05)ではじまるコメントを付けています。(※ユーザ登録時のメール送信処理も含まれています。必要な場合はお手数ですが、こちらを参照してメール送信のアカウントを設定するか、メール送信処理を削除して下さい。)
(ホーム)\App_Start\IdentityConfig.cs のApplicationUserManagerクラスのCreateメソッドを以下のように修正します。
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); // ユーザー名の検証ロジックを設定します manager.UserValidator = new UserValidator<ApplicationUser>(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; //途中省略 //デフォルトロックセッティング追加 manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(1); //テスト用に1分だけ manager.MaxFailedAccessAttemptsBeforeLockout = 4; //間違いは3回まで return manager; }
最後の部分のreturn の上2行が追加した部分です。ここでコメントに書きましたが、デフォルトのユーザアカウントロックセッティングをしています。ここではテスト的にパスワードの間違いは3回までで、4回間違えると1分間ロックされます。
次にログインの処理を変更します。(ホーム)\Account\Login.aspx.csです。
protected void LogIn(object sender, EventArgs e) { if (IsValid) { // ユーザーのパスワードを検証します var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>(); ApplicationUser user = manager.Find(Email.Text, Password.Text); if (user != null) { //(ISY01)ログインの際にメール確認を条件にする if (!user.EmailConfirmed) { FailureText.Text = "メールで認証を行ってください。"; ErrorMessage.Visible = true; return; } // (ISY05)ユーザロック if (manager.IsLockedOut(user.Id)) { FailureText.Text = "ユーザーがロックされました。しばらくしてからアクセスして下さい。"; ErrorMessage.Visible = true; return; } // (ISY05)パスワードが正しい場合はリトライをクリア manager.ResetAccessFailedCount(user.Id); //通常のログイン IdentityHelper.SignIn(manager, user, RememberMe.Checked); IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response); } else { //(ISY05)ユーザは存在するかどうか user = manager.FindByName(Email.Text); //ユーザが存在しない場合 FailureText.Text = "ユーザー名またはパスワードが無効です。"; ErrorMessage.Visible = true; if (user == null) { return; } //パスワードが違う場合 else { manager.SetLockoutEnabled(user.Id, true); //ロックを可にしておく manager.AccessFailed(user.Id); //ログイン出来ない //(ISY05)これでリトライカウントが取得できる(ここでは未使用) //int cnt = user.AccessFailedCount; if (manager.IsLockedOut(user.Id)) { FailureText.Text = "ユーザーがロックされました。しばらくしてからアクセスして下さい。"; } } } } }
//(ISY05)のコメントの部分が今回追加した部分です。ユーザアカウントがロックされている場合の処理、パスワードが正しい場合の処理、間違っている場合の処理をそれぞれ行っています。これらのアカウントの処理は設計(ポリシー)次第です。ここではコメントアウトしていますが、リトライの回数も取得出来ますので、次回で試してみますが、一定の回数を超えた場合はセキュリティコードをメールで送信して2要素認証を併用するという方法もあります。
今回はここまでです。次回は、2要素認証です。
今回のシリーズの一覧
ASP.NETユーザ管理(その1)identityフレームワーク
ASP.NETユーザ管理(その2)WebFormsでのASP.NET Identity
ASP.NETユーザ管理(その3)ユーザ登録時のメール確認
ASP.NETユーザ管理(その4)ユーザ情報の追加
ASP.NETユーザ管理(その5)メンバー専用エリアと管理者ページ
ASP.NETユーザ管理(その6)ロール管理の追加
ASP.NETユーザ管理(その7)ユーザアカウントロック
ASP.NETユーザ管理(その8) 2要素認証
ASP.NETユーザ管理(その9) パスワードのリセット