示例#1
0
        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));
        }