web-dev-qa-db-ja.com

ASP.Net Identity 2.0AccessFailedCountが増分しない

昨夜、FormsAuthenticationを使用して新しいプロジェクトに取り組んでおり、セキュリティトークンを含めるようにチケットをカスタマイズしていたため、ユーザーが1つのブラウザーでログオフすると、すべてのブラウザーでログオフします。 ASP.net Identityの最新のイテレーションを見ると、すでにこの機能が組み込まれているように見えます。

個人アカウントを有効にして、新しいテストMVC 5Webアプリケーションを作成しました。登録と認証は箱から出してすぐに機能しました。

ただし、失敗したログイン試行では、AspNetUsersテーブルのAccessFailedCountフィールドがインクリメントされていないことに気付きました。そして、それは増加していなかったので、アカウントをロックアウトすることなく、失敗したログイン試行を何度でも試すことができました。

ASP.net Identity 2.0でAccessFailedCountおよびLockout機能を有効にするにはどうすればよいですか?

17
Sam

これは手動で処理する必要があります。 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);
    }
}
25
meziantou

「shouldLockout」引数を受け入れるPasswordSignInAsyncもあります。これをtrueに設定すると、失敗したログイン試行が自動的にインクリメントされます

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true);
14
Fred Johnson

.NET Core 2.1の場合、shouldLockoutという名前になりましたlockoutOnFailure

したがって、失敗したログイン試行をインクリメントするには、ログイン呼び出しは次のようになります。

var result = await SignInManager.PasswordSignInAsync(loginModel.Email, loginModel.Password, loginModel.RememberMe, lockoutOnFailure: true);

これにより、ユーザーが正常にログインすると、失敗したログイン試行もリセットされます。

4
StefanJM