protected virtual async Task <LoginResult <TUser> > LoginAsyncInternal(string userName, string plainPassword, bool shouldLockout) { if (userName.IsNullOrEmpty()) { throw new ArgumentNullException(nameof(userName)); } if (plainPassword.IsNullOrEmpty()) { throw new ArgumentNullException(nameof(plainPassword)); } //1. Verificar si existe Usuario var user = await UserManager.FindByNameAsync(userName); if (user == null) { return(new LoginResult <TUser>(LoginResultType.InvalidUserNameOrEmailAddress)); } //2 Verificar si existe un bloqueo. if (await UserManager.IsLockedOutAsync(user.Id)) { return(new LoginResult <TUser>(LoginResultType.LockedOut, user)); } //3. Verificar Clave. var verificationResult = await PasswordManager.ValidateCredentials(user, plainPassword); //(Realizar bloqueo por intentos fallidos) if (verificationResult == PasswordVerificationResult.Failed) { return(await GetFailedPasswordValidationAsLoginResultAsync(user, shouldLockout)); } if (verificationResult == PasswordVerificationResult.SuccessRehashNeeded) { return(await GetSuccessRehashNeededAsLoginResultAsync(user)); } await UserManager.ResetAccessFailedCountAsync(user.Id); //4. Existe codigo de reseteo de Clave if (!string.IsNullOrWhiteSpace(await user.GetPasswordResetCode(user))) { return(new LoginResult <TUser>(LoginResultType.SucessPasswordResetCode, user)); } return(new LoginResult <TUser>(LoginResultType.SucessAuthentication, user)); }