株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。Raspberry Pi や Arduino その他新規開発案件のご依頼をお待ちしております。

ASP.NET

ASP.NETユーザ管理(その7)ユーザアカウントロック

投稿日:

0006ASP.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) パスワードのリセット

AdSense

AdSense

-ASP.NET

執筆者:

関連記事

ASP.NET Web APIでデータ蓄積(その4)ASP.NET ApiControllerクラスとView

ASP.NET Web APIでデータ蓄積の4回目です。前回はASP.NET ApiControllerクラスについて書きました。今回はViewと連携させてみます。 まずは前回ですが、以下のようなUR …

no image

ASP.NETユーザ管理(その2)WebFormsでのASP.NET Identity

ASP.NETユーザ管理の2回目です。前回は、主にASP.NET Identityとはといった概要的な内容について書きました。今回から実際に動作させながら確認します。 WebFormsのテンプレートを …

no image

ASP.NETユーザ管理(その3)ユーザ登録時のメール確認

ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の3回目です。前回は、ASP.NET Identityのクラス、インターフェース構成とWebFormsでのテンプレートでの初期 …

ASP.NET Web APIでデータ蓄積(その2)ASP.NET コードファーストでのモデル構築

ASP.NET Web APIでデータ蓄積の2回目です。前回は、ASP.NET Web APIについて概要的なことを書きました。今回から実際にデータ蓄積アプリ的なものを構築しますが前回の最後に書いた通 …

ASP.NET Web APIでデータ蓄積(その1)ASP.NET Web APIとは

ASP.NET Web APIを利用してデータを蓄積する機能を実装してみたいと思います。漠然とデータ蓄積といってもいろいろなデータがあると思いますが、ここではセンサー等のデバイスから自動的に送信された …