public async Task <UserRegisterResponse> Handle(UserRegisterCommand input) { await new UserRegisterCommandValidator().ValidateAndThrowAsync(input); var user = _mapper.Map <User>(input); if (string.IsNullOrEmpty(user.UserName)) { user.UserName = new string(user.Email.TakeWhile(c => c != '@').ToArray()); } var identityResult = await _userManager.CreateAsync(user, input.Password); if (!identityResult.Succeeded) { throw new IdentityResultException(identityResult); } var confirmationToken = await _userManager.GenerateEmailConfirmationTokenAsync(user); var callbackUrl = _urlHelper.Action( "ConfirmEmail", "User", new UserConfirmEmailCommand { UserId = user.Id, ConfirmationToken = confirmationToken }, protocol: _httpContextAccessor.HttpContext.Request.Scheme); //TODO: Подумать. Возможно не стоит дожидаться отправки письма await _emailSender.SendEmailAsync(input.Email, "Подтвердите регистрацию", $"Подтвердите регистрацию, перейдя по ссылке: <a href='{callbackUrl}'>link</a>"); var tokenString = await _jwtGetTokenStringForUserHandler.Handle(user); user.UserJwtTokens = new List <UserJwtToken> { new UserJwtToken { Token = tokenString, ExpirationDateTime = DateTime.UtcNow.AddDays(1) } }; await _userManager.UpdateAsync(user); return(new UserRegisterResponse { Token = tokenString }); }
public async Task <UserLoginResponse> Handle(UserLoginCommand input) { var user = await _userManager.FindByEmailAsync(input.Email); //Возвращаем одинаковые ошибки, избегаем подбора if (user == null) { throw new AuthenticationException("Неверный email или пароль"); } var isPasswordOk = await _userManager.CheckPasswordAsync(user, input.Password); if (!isPasswordOk) { var identityResult = await _userManager.AccessFailedAsync(user); throw !identityResult.Succeeded ? (Exception) new IdentityResultException(identityResult) : new AuthenticationException("Неверный email или пароль"); } var tokenString = await _jwtGetTokenStringForUserHandler.Handle(user); await _arterialPressureContext.UserJwtTokens.AddAsync(new UserJwtToken { UserId = user.Id, Token = tokenString, ExpirationDateTime = input.RememberMe ? (DateTime?)null : DateTime.Now.AddDays(1) }); await _arterialPressureContext.SaveChangesAsync(); return(new UserLoginResponse { Token = tokenString, EmailConfirmed = user.EmailConfirmed }); }