public void ChangePassword(int userId, string oldPasswordValue, string newPasswordValue) { var user = _userManager.GetUserById(userId); var oldPassword = user.Credentials.Passwords.First(p => p.IsActive); if (oldPassword.Value != _passwordHasher.GetHash(oldPasswordValue)) { throw new OldPasswordWrongException("Old password is wrong"); } if (!_passwordPolicy.SatisfiesPolicy(user, newPasswordValue)) { throw new PasswordDoesNotSatisfyPolicyException("New password does not apply password policy."); } var newPassword = new Password(); newPassword.Value = _passwordHasher.GetHash(newPasswordValue); newPassword.ExpirationDate = DateTimeOffset.Now.AddYears(1); newPassword.Credentials = user.Credentials; newPassword.IsActive = true; user.Credentials.Passwords.Add(newPassword); oldPassword.IsActive = false; _userManager.UpdateUser(); }
/// <exception cref="UnauthorizedException" /> public async Task ChangePasswordViaOldPassword(User user, String oldPassword, String newPassword, CancellationToken cancellationToken) { if (!_passwordHasher.TestPassword(user, oldPassword)) { throw new UnauthorizedException(); } user.SetPasswordHash(_passwordHasher.GetHash(user, newPassword)); await _refreshTokenStore.ExpireAllTokens(user.Id, cancellationToken); }
public ActionResult <User> Post([FromBody] UserAuthentication inputUser) { string passwordHash = _passwordHasher.GetHash(inputUser.Password); var user = _userDb.Users.FirstOrDefault(u => u.Login == inputUser.Login && u.PasswordHash == passwordHash); if (user != null && (user.RefreshToken == null || TokenService.IsRefreshTokenExpired(user.RefreshToken))) { // create JWT user.RefreshToken = TokenService.GenerateToken(user.Login); _userDb.Users.Update(user); _userDb.SaveChanges(); } return(user); }
public async Task <User> CreateByEmail(Guid id, Guid guildId, String email, String password, String name, DateTime?dateOfBirth = null, GamerRank rank = GamerRank.Beginner, GamerStatus status = GamerStatus.New, CancellationToken cancellationToken = default) { var user = await _repository.Get(id, cancellationToken); if (user == null) { user = await _repository.GetUserByEmail(email, guildId, cancellationToken); } if (user != null) { if (user.Id == id && user.Email == email && user.Name == name && user.GuildId == guildId && (dateOfBirth == null || user.DateOfBirth == dateOfBirth)) { return(user); } throw new UserAlreadyExistsException(); } user = new User(id, guildId, name, rank, status, dateOfBirth ?? DateTime.UtcNow, null, email); user.SetPassword(_passwordHasher.GetHash(user.Id, user.Email, password)); return(user); }
public async Task <ActionResult> Register([FromForm] RegisterModel model) { if (ModelState.IsValid) { ApplicationUser user = new ApplicationUser { UserName = model.UserName, Email = model.Email, Password = _passwordHasher.GetHash(model.Password, model.UserName) }; await _userRepository.RegisterUser(user); var callbackUrl = Url.Action( "ConfirmEmail", "Account", new { userId = user.Id }, protocol: HttpContext.Request.Scheme); EmailService emailService = new EmailService(); try { await emailService.SendEmailAsync(model.Email, "Подтвердите Ваш аккаунт", $"Спасибо за регистрацию в нашем магазине! <br />Для того чтобы приступить к покупкам, подтвердите регистрацию, перейдя по ссылке. <br /><a href='{callbackUrl}'>Подтвердить!</a>"); return(Ok()); } catch { return(BadRequest()); } } return(BadRequest("Wrong email or password")); }
public void CreatePassword(User gamer, String password) { if (!string.IsNullOrEmpty(gamer.Password)) { throw new InvalidOperationException("У пользователя пароль уже существует."); } gamer.SetPassword(_passwordHasher.GetHash(gamer.Id, gamer.Login, password)); }
public void ResetPassword(string username, string secretAnswer, string newPassword) { var hashedPassword = _hasher.GetHash(newPassword); if (!_accountRepository.TryUpdatePassword(username, secretAnswer, hashedPassword)) { throw new PasswordResetFailedException("Password reset failed!"); } }
public async Task <ReadFullUserModel> AddUserAsync(CreateUserModel model, CancellationToken cancellationToken) { var user = _mapper.Map <User>(model); await SetRolesForUserModel(model.Roles, user, cancellationToken); user.AvatarId = await _fileService.AddOrUpdateFileByIdAsync(model.Avatar, user.AvatarId, cancellationToken); user.Password = _hasher.GetHash(model.Password); await _userRepository.AddAsync(user, cancellationToken); await _unitOfWork.SaveChangesAsync(cancellationToken); await SendEmail(model, cancellationToken); return(_mapper.Map <ReadFullUserModel>(user)); }
private static MapperConfigurationExpression GetMapperConfigurationExpression(IPasswordHasher passwordHasher) { var mapperConfigurationExpression = new MapperConfigurationExpression(); mapperConfigurationExpression.CreateMap <Client.User, Server.User>() .ForMember(dest => dest.PasswordHash, opts => opts.MapFrom( src => passwordHasher.GetHash(src.Password))); mapperConfigurationExpression.CreateMap <Server.User, Client.User>(); return(mapperConfigurationExpression); }
public void RecoverPassword(string newPasswordValue, string codeValue) { _confirmationCodeService.ValidateCode(codeValue); var user = _confirmationCodeService.GetRelatedUser(codeValue); if (_passwordPolicy.SatisfiesPolicy(user, newPasswordValue)) { newPasswordValue = _passwordHasher.GetHash(newPasswordValue); user.UpdatePassword(newPasswordValue); _confirmationCodeService.DeactivateCode(codeValue); } }
public User Authentificate(CredentialsDraft credentialsDraft) { var user = _userManager.GetUserByLogin(credentialsDraft.login); var password = _passwordHasher.GetHash(credentialsDraft.password); if (user != null && user.Credentials.Passwords.Find(p => p.IsActive).Value != password) { user = null; } return(user); }
public void RecoverPassword(string newPasswordValue, string codeValue) { _confirmationCodeService.ValidateCode(codeValue, Models.ConfirmationCodeType.PasswordRecovery); var user = _confirmationCodeService.GetRelatedUser(codeValue); if (!_passwordPolicy.SatisfiesPolicy(user, newPasswordValue)) { throw new PasswordDoesNotSatisfyPolicyException("Password does not satisfy policy."); } newPasswordValue = _passwordHasher.GetHash(newPasswordValue); user.UpdatePassword(newPasswordValue); _confirmationCodeService.DeactivateCode(codeValue); }
private void RegisterUser(RegisterViewModel model) { dbContext.Users.Add(new User { Email = model.Email, Name = model.Name, Surname = model.Surname, Patronymic = model.Patronymic, Password = passwordHasher.GetHash(model.Password), Phone = model.Phone, DriverLicense = model.DriverLicense, Registration = model.Registration, IsAdmin = false, Passport = model.Passport }); dbContext.SaveChanges(); }
public Task <ClaimsIdentity> Claims(string userName, string password) { var user = _context.Users .FirstOrDefault(usr => usr.UserName == userName); if (user != null) { var passwordCorrect = user.Password.SequenceEqual(_passwordHasher.GetHash(password, userName)); if (!passwordCorrect) { return(Task.FromResult((ClaimsIdentity)null)); } var claims = new List <Claim> { new Claim(ClaimsIdentity.DefaultNameClaimType, user.UserName), new Claim("UserId", user.Id.ToString()), new Claim(ClaimsIdentity.DefaultRoleClaimType, "user"), new Claim("RoleId", user.RoleId.ToString()) }; ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, "Token", ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType); return(Task.Run(() => claimsIdentity)); } return(Task.FromResult((ClaimsIdentity)null)); }
public async Task InitializeAsync() { await _context.Database.MigrateAsync(); var user1 = new User { FirstName = "Admin", LastName = "Exoft", Email = "*****@*****.**", UserName = "******", XP = 30, Password = _passwordHasher.GetHash("Pa$$word123"), Status = "Status bla bla bla" }; var user2 = new User { FirstName = "Tanya", LastName = "Gogina", Email = "*****@*****.**", UserName = "******", XP = 40, Password = _passwordHasher.GetHash("Pa$$word123"), Status = "Status 123" }; var user3 = new User { FirstName = "Ostap", LastName = "Roik", Email = "*****@*****.**", UserName = "******", XP = 0, Password = _passwordHasher.GetHash("Pa$$word123"), Status = "Status 123" }; var achievement1 = new Achievement { Name = "Welcome", Description = "A newcomer to the team", XP = 10 }; var achievement2 = new Achievement { Name = "1 year", Description = "1 year in company", XP = 30 }; var role1 = new Role { Name = "Admin" }; var role2 = new Role { Name = "User" }; var event1 = new Event { Description = "First", Type = GamificationEnums.EventType.Race, User = user1 }; var event2 = new Event { Description = "Second", Type = GamificationEnums.EventType.Records, User = user1 }; var event3 = new Event { Description = "Third", Type = GamificationEnums.EventType.Upload, User = user2 }; if (!await _context.Users.AnyAsync()) { await _context.Users.AddAsync(user1); await _context.Users.AddAsync(user2); await _context.SaveChangesAsync(); } if (!await _context.Achievements.AnyAsync()) { await _context.Achievements.AddAsync(achievement1); await _context.Achievements.AddAsync(achievement2); await _context.SaveChangesAsync(); } if (!await _context.Roles.AnyAsync()) { await _context.Roles.AddAsync(role1); await _context.Roles.AddAsync(role2); await _context.SaveChangesAsync(); } if (!await _context.UserAchievement.AnyAsync()) { await _context.UserAchievement.AddAsync(new UserAchievement { User = user1, Achievement = achievement2 }); await _context.UserAchievement.AddAsync(new UserAchievement { User = user2, Achievement = achievement1 }); await _context.UserAchievement.AddAsync(new UserAchievement { User = user2, Achievement = achievement2 }); await _context.SaveChangesAsync(); } if (!await _context.UserRoles.AnyAsync()) { await _context.UserRoles.AddAsync(new UserRoles { User = user1, Role = role1 }); await _context.UserRoles.AddAsync(new UserRoles { User = user2, Role = role2 }); await _context.UserRoles.AddAsync(new UserRoles { User = user3, Role = role2 }); await _context.SaveChangesAsync(); } if (!await _context.Events.AnyAsync()) { await _context.Events.AddAsync(event1); await _context.Events.AddAsync(event2); await _context.Events.AddAsync(event3); await _context.SaveChangesAsync(); } if (!await _context.Categories.AnyAsync()) { var bytes = Convert.FromBase64String( "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"); var file = new File { ContentType = "image/png", Data = bytes }; await _context.Files.AddAsync(file); await _context.SaveChangesAsync(); await _context.Categories.AddRangeAsync(new List <Category> { new Category { Name = "Apple", IconId = file.Id }, new Category { Name = "Android", IconId = file.Id }, new Category { Name = "Health", IconId = file.Id }, new Category { Name = "Food", IconId = file.Id }, new Category { Name = "Man", IconId = file.Id }, new Category { Name = "Woman", IconId = file.Id }, new Category { Name = "Car", IconId = file.Id }, new Category { Name = "Sport", IconId = file.Id }, new Category { Name = "Games", IconId = file.Id }, new Category { Name = "Puzzle", IconId = file.Id }, new Category { Name = "Animal", IconId = file.Id }, new Category { Name = "Steam", IconId = file.Id } }); await _context.SaveChangesAsync(); } }
private async Task <bool> CheckPasswordAsync(string password, CancellationToken cancellationToken) { var user = await _userRepository.GetByIdAsync(CurrentUserId, cancellationToken); return(user.Password == _hasher.GetHash(password)); }
public StaticAccountRepository(IPasswordHasher hasher) { _hasher = hasher; _knownAccounts.Add("admin", new UserAccount("admin", _hasher.GetHash("passw0rd"), "Yokel", true)); }