public override async Task <User> AddAsync(User obj) { // Verifica se o usuário já existe var existingEmail = await CheckUserExistByEmail(obj.Email); var existingUsername = await CheckUserExistByEmail(obj.Username); if (!existingEmail && !existingUsername) { // Cria salt e salt e salva no objeto var salt = EncryptPassword.CreateSaltArgon2(); obj.Hash = Convert.ToBase64String(EncryptPassword.HashPasswordArgon2(obj.Password, salt)); obj.Salt = Convert.ToBase64String(salt); // Adicona o usuário obj.Password = "******"; var user = await base.AddAsync(obj); // Escondo hash e salt user.Hash = ""; user.Salt = ""; return(user); } return(null); }
/// <summary> /// Autentica o usuário no sistema. /// </summary> /// <param name="username">Username</param> /// <param name="password">Password</param> /// <returns>Retorna um usuário caso ele exista, do contrário retorna null.</returns> public virtual async Task <User> Authenticate(string username, string password) { User user; // Verifica se já existe usuário no sistema if (FirstAccess()) { // Cria usuário user = new User(username, password, "*****@*****.**", "admin"); await this.AddAsync(user); } else { // Busca usuário var allUsers = await _userRepository.GetAllAsync(); user = allUsers.Where(x => x.Username == username).FirstOrDefault(); // Valida if (user != null) { // gera hash var salt = Convert.FromBase64String(user.Salt); var hash = EncryptPassword.HashPasswordArgon2(password, salt); // Valida hash if (EncryptPassword.VerifyHash(password, salt, hash)) { user = await _userRepository.GetByIdAsync(user.Id); } else { user = null; } } } // Esconde o password if (user != null) { user.Password = null; } // Retorna o usuário return(user); }
public override async Task <int> UpdateAsync(User obj) { // Obtem usuário para saber hash e salt var user = await this.GetByIdAsync(obj.Id); // Verifica se password foi alterado if (obj.Password == "p@ssword") { obj.Hash = user.Hash; obj.Salt = user.Salt; } else { // Cria salt e salt e salva no objeto var salt = EncryptPassword.CreateSaltArgon2(); obj.Hash = Convert.ToBase64String(EncryptPassword.HashPasswordArgon2(obj.Password, salt)); obj.Salt = Convert.ToBase64String(salt); obj.Password = "******"; } return(await base.UpdateAsync(obj)); }