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