public async Task <IActionResult> ForgotPassword([FromBody] RequestPasswordResetDto requestPasswordResetDto) { var userIp = Request.HttpContext.Connection.RemoteIpAddress; if (_cacheService.IsNumberOfAttempsExceededRecovery(userIp)) { if (requestPasswordResetDto.RecaptchaResponse == null || !await _reCaptchaValidation.ValidateRecaptcha(requestPasswordResetDto.RecaptchaResponse)) { _cacheService.UpdateAttempsCountRecovery(userIp); _logger.LogInformation($"Invalid captcha validation: {userIp}"); return(BadRequest(_reCaptchaValidation.CreateCaptchaResponseRecovery(false, true))); } } var result = _cacheService.HandleAttempsRecovery(userIp); var resetToken = await _changePasswordService.SendResetLink(requestPasswordResetDto.Email); _logger.LogInformation(resetToken == null ? $"User with email: {requestPasswordResetDto.Email} fails to generate token" : $"User with email: {requestPasswordResetDto.Email} send reset password request with token: {resetToken}" ); return(Ok(_reCaptchaValidation.CreateCaptchaResponseRecovery(true, result))); }