/// <summary>
        /// Perform the forgotten password process based on the given input model
        /// </summary>
        /// <param name="inputModel">The forgotten password input model object</param>
        /// <returns>Forgotten password view model correctly populated for display, regardless of mode</returns>
        public ForgottenPasswordViewModel ForgottenPassword(ForgottenPasswordInputModel inputModel)
        {
            ForgottenPasswordViewModel viewModel;

            switch (inputModel.Mode)
            {
            case GlobalConstants.PASSWORD_ENC_MODE_INITIAL:
                viewModel      = new ForgottenPasswordViewModel(true);
                viewModel.Mode = GlobalConstants.PASSWORD_ENC_MODE_INITIAL;
                break;

            case GlobalConstants.PASSWORD_ENC_MODE_USER_SIGNED_IN:
                viewModel      = new ForgottenPasswordViewModel(true);
                viewModel.Mode = GlobalConstants.PASSWORD_ENC_MODE_USER_SIGNED_IN;
                break;

            case GlobalConstants.PASSWORD_ENC_MODE_RESPONSE:
                viewModel = getCustomerDetailsFromBackEnd(inputModel);
                break;

            default:
                viewModel = new ForgottenPasswordViewModel(true);
                break;
            }
            return(viewModel);
        }
        public IActionResult ForgottenPassword(string returnUrl)
        {
            ForgottenPasswordInputModel vm = new ForgottenPasswordInputModel {
                ReturnUrl = returnUrl
            };

            return(View(vm));
        }
        public async Task <IActionResult> ForgottenPassword(ForgottenPasswordInputModel model)
        {
            if (ModelState.IsValid)
            {
                var user = await _userManager.FindByEmailAsync(model.Email);

                if (user == null || !(await _userManager.IsEmailConfirmedAsync(user)))
                {
                    return(View(model));
                }

                var code = await _userManager.GeneratePasswordResetTokenAsync(user);

                /* Mail */
                string mailMessage = $"Obnovení hesla zahájíte zadáním kódu: " + code;
                var    callbackUrl = Url.Action(
                    "ResetPassword",
                    "Account",
                    values: new { code },
                    protocol: Request.Scheme);
                mailMessage += "\nMůžete použít vygenerovaný odkaz: " + callbackUrl;

                string htmlBody = await _razorRenderer.RenderViewToStringAsync("/Emails/Pages/PasswordReset.cshtml", new ConfirmEmailViewModel
                {
                    ConfirmationCode = code,
                    User             = user,
                    ConfirmEmailUrl  = callbackUrl != "" ? callbackUrl : "",
                    AppUrl           = HtmlEncoder.Default.Encode(Request.Scheme + "://" + Request.Host.Value)
                });

                _emailSender.HtmlMessage = htmlBody;

                await _emailSender.SendEmailAsync(user.Email, "Resetování hesla", mailMessage);

                return(View("ForgottenPasswordConfirmation", model));
            }

            return(View(model));
        }
        /// <summary>
        /// Perform the customer details retrieval process and return a view model with error handling
        /// </summary>
        /// <param name="inputModel">The forgotten password input model object</param>
        /// <returns>Forgotten password view model correctly populated for display</returns>
        private ForgottenPasswordViewModel getCustomerDetailsFromBackEnd(ForgottenPasswordInputModel inputModel)
        {
            ErrorObj   talentErrObj = new ErrorObj();
            DECustomer deCust       = new DECustomer();

            Mapper.CreateMap <ForgottenPasswordInputModel, DECustomer>();
            DECustomerV11 deCustV11 = new DECustomerV11();
            ForgottenPasswordViewModel viewModel = new ForgottenPasswordViewModel(true);

            deCust        = Mapper.Map <DECustomer>(inputModel);
            deCust.Source = GlobalConstants.SOURCE;
            deCustV11.DECustomersV1.Add(deCust);
            _talCust.DeV11    = deCustV11;
            _talCust.Settings = Environment.Settings.DESettings;
            talentErrObj      = _talCust.CustomerRetrieval();
            viewModel.Error   = Data.PopulateErrorObject(talentErrObj, _talCust.ResultDataSet, _talCust.Settings, 2);

            if (!viewModel.Error.HasError)
            {
                //Add the tokens to the result Set
                _dtCustomerResults = _talCust.ResultDataSet.Tables["CustomerResults"];
                if (_dtCustomerResults.Rows.Count == 1)
                {
                    _doTokenHashing = inputModel.DoTokenHashing;
                    checkCustomerTokens();
                    if (generateResetTokens())
                    {
                        if (generateTableRecords())
                        {
                            generateEmail();
                            viewModel.Mode = GlobalConstants.PASSWORD_ENC_MODE_RESPONSE;
                        }
                        else
                        {
                            viewModel.Mode               = GlobalConstants.PASSWORD_ENC_MODE_INITIAL;
                            viewModel.Error.HasError     = true;
                            viewModel.Error.ErrorMessage = viewModel.GetPageText("UnspecifiedError");
                            _talCust.Settings.Logging.ErrorObjectLog("ForgottenPassword.aspx - Reset Password email", "FPW", "Cannot create reset password table records", "PasswordEncryptionLog");
                        }
                    }
                    else
                    {
                        viewModel.Mode               = GlobalConstants.PASSWORD_ENC_MODE_INITIAL;
                        viewModel.Error.HasError     = true;
                        viewModel.Error.ErrorMessage = viewModel.GetPageText("UnspecifiedError");
                        _talCust.Settings.Logging.ErrorObjectLog("ForgottenPassword.aspx - Reset Password email", "FPW", "Cannot create reset password tokens", "PasswordEncryptionLog");
                    }
                }
                else
                {
                    viewModel.Mode               = GlobalConstants.PASSWORD_ENC_MODE_INITIAL;
                    viewModel.Error.HasError     = true;
                    viewModel.Error.ErrorMessage = viewModel.GetPageText("UnspecifiedError");
                    _talCust.Settings.Logging.ErrorObjectLog("ForgottenPassword.aspx - Reset Password email", "FPW", "No customer records have been returned from WS009R", "PasswordEncryptionLog");
                }
            }
            else
            {
                viewModel.Mode = GlobalConstants.PASSWORD_ENC_MODE_INITIAL;
                _talCust.Settings.Logging.ErrorObjectLog("ForgottenPassword.aspx - Reset Password email", "FPW", viewModel.Error.ErrorMessage, "PasswordEncryptionLog");
            }
            return(viewModel);
        }