避免在 ASP.Net Identity 中通过 CheckPasswordSignIn 重置 AccessFailedCount

问题描述 投票:0回答:1

这是我的程序.cs:

//Options For Identity
opt.Lockout.AllowedForNewUsers = true;  //True Bcz I want Active For All Users
opt.Lockout.DefaultLockoutTimeSpan = new TimeSpan(100, 1, 1, 1); //Its Like Ban For Ever
opt.Lockout.MaxFailedAccessAttempts = 10; //Just Admin Can Increase This For Users

这是我的身份验证登录操作:

Check Username ->
_signInManager.UserManager.FindByNameAsync(model.Username);
Check Password -> 
_signInManager.CheckPasswordSignInAsync(userId, Password, False) 
//False Because I dont Want Increse AccessFailedCount In database for Wrong Passwords

现在如果管理员想要报告用户(UserId),就会发生这种情况:

_userManager.AccessFailedAsync(UserId); //Its Like Increase +1  AccessFailedCount In DataBase

所以现在我的期望是,如果管理员报告用户 10 次 -> 用户将永远被禁止

但问题是这样的:如果用户登录到我的 WebApi -> 此方法 _signInManager.CheckPasswordSignInAsync 自动会将 AccessFailedCount 重置为 0 ... :(

如何避免通过此方法在一次成功登录用户后重置AccessFailedCount

请不要说不可能......(最后给我新策略) 我的 Api 已准备好我需要紧急帮助

c# asp.net authentication asp.net-identity identity
1个回答
0
投票

我不相信您可以避免重置此计数,但是可以实现类似的效果,如下所示:

  • 在登录之前从用户对象获取 AccessFailedAcount
  • 让用户登录
  • 将 AccessFailedCount 恢复到用户对象
  • 通过UserManager更新用户对象

我测试了下面的代码,使用的登录方法与你略有不同,但原理应该是完全相同的。

            //get access failed count
            var signinManager = HttpContext.GetOwinContext().GetUserManager<ApplicationSignInManager>();
            var user = signinManager.UserManager.Find(model.Email,model.Password);
            int AccessFailedCount = user.AccessFailedCount;

            //sign user in.
            var result = signinManager.PasswordSignIn(user.UserName, model.Password, false, shouldLockout: false);
            if (result == SignInStatus.Success)
            {
                //restore access failed count.
                user.AccessFailedCount = AccessFailedCount;
                signinManager.UserManager.Update(user);
                //redirect away from login page.
            }
© www.soinside.com 2019 - 2024. All rights reserved.