昨夜、FormsAuthenticationを使用して新しいプロジェクトに取り組んでおり、セキュリティトークンを含めるようにチケットをカスタマイズしていたため、ユーザーが1つのブラウザーでログオフすると、すべてのブラウザーでログオフします。 ASP.net Identityの最新のイテレーションを見ると、すでにこの機能が組み込まれているように見えます。
個人アカウントを有効にして、新しいテストMVC 5Webアプリケーションを作成しました。登録と認証は箱から出してすぐに機能しました。
ただし、失敗したログイン試行では、AspNetUsersテーブルのAccessFailedCountフィールドがインクリメントされていないことに気付きました。そして、それは増加していなかったので、アカウントをロックアウトすることなく、失敗したログイン試行を何度でも試すことができました。
ASP.net Identity 2.0でAccessFailedCountおよびLockout機能を有効にするにはどうすればよいですか?
これは手動で処理する必要があります。 CheckPassword
メソッドはPasswordHasher.VerifyHashedPassword
メソッドを呼び出してパスワードを検証しますが、提供されたパスワードが既存のパスワードと一致しない場合、アクセス失敗数は更新されません。
ロックアウトをサポートする認証方法の例を次に示します。
UserManager<User> userManager = new UserManager<User>(new UserStore());
if (userManager.SupportsUserLockout && userManager.IsLockedOut(userId))
return;
var user = userManager.FindById(userId);
if (userManager.CheckPassword(user, password))
{
if (userManager.SupportsUserLockout && userManager.GetAccessFailedCount(userId) > 0)
{
userManager.ResetAccessFailedCount(userId);
}
// Authenticate user
}
else
{
if (userManager.SupportsUserLockout && userManager.GetLockoutEnabled(userId))
{
userManager.AccessFailed(userId);
}
}
「shouldLockout」引数を受け入れるPasswordSignInAsyncもあります。これをtrueに設定すると、失敗したログイン試行が自動的にインクリメントされます
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true);
.NET Core 2.1の場合、shouldLockoutという名前になりましたlockoutOnFailure
したがって、失敗したログイン試行をインクリメントするには、ログイン呼び出しは次のようになります。
var result = await SignInManager.PasswordSignInAsync(loginModel.Email, loginModel.Password, loginModel.RememberMe, lockoutOnFailure: true);
これにより、ユーザーが正常にログインすると、失敗したログイン試行もリセットされます。