Beispiel #1
0
        public virtual async Task <ActionResult> PasswordResetEmail(PasswordResetEmailViewModel model)
        {
            try
            {
                CheckModelState();

                using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant))
                {
                    var user = await _userManager.Users.Where(u => u.EmailAddress.Contains(model.EmailAddress)).FirstOrDefaultAsync();

                    if (user == null || !(await _userManager.IsEmailConfirmedAsync(user.Id)))
                    {
                        // Don't reveal user existence or email confirm status
                        return(View("PasswordResetEmailResult"));
                    }

                    var dataProtectionProvider = Startup.DataProtectionProvider;
                    _userManager.UserTokenProvider = new DataProtectorTokenProvider <User, long>(dataProtectionProvider.Create("PasswordResetConfirmation"))
                    {
                        TokenLifespan = TimeSpan.FromDays(1)
                    };
                    var resetCode = _userManager.GeneratePasswordResetTokenAsync(user.Id);
                    await SendPasswordResetEmail(user.EmailAddress, HttpUtility.HtmlEncode(resetCode), user.Name, user.Id);

                    return(View("PasswordResetEmailResult"));
                }
            }
            catch (UserFriendlyException ex)
            {
                Logger.Warn("Reset password failed", ex);
                return(View("PasswordResetEmailResult"));
            }
        }
        public async Task SendPasswordResetEmailAsync(
            ISiteContext siteSettings,
            string toAddress,
            string subject,
            string resetUrl)
        {
            var sender = await _emailSenderResolver.GetEmailSender(siteSettings.Id.ToString());

            if (sender == null)
            {
                var logMessage = $"failed to send password reset email because email settings are not populated for site {siteSettings.SiteName}";
                _log.LogError(logMessage);
                return;
            }

            var model = new PasswordResetEmailViewModel
            {
                Tenant   = siteSettings,
                ResetUrl = resetUrl
            };

            // in account controller we are calling this method without await
            // so it doesn't block the UI. Which means it is running on a background thread
            // similar as the old ThreadPool.QueueWorkItem
            // as such we need to handle any error that may happen so it doesn't
            // brind down the thread or the process
            try
            {
                var plainTextMessage
                    = await _viewRenderer.RenderViewAsString <PasswordResetEmailViewModel>("EmailTemplates/PasswordResetTextEmail", model);

                var htmlMessage
                    = await _viewRenderer.RenderViewAsString <PasswordResetEmailViewModel>("EmailTemplates/PasswordResetHtmlEmail", model);

                await sender.SendEmailAsync(
                    toAddress,
                    siteSettings.DefaultEmailFromAddress,
                    subject,
                    plainTextMessage,
                    htmlMessage,
                    configLookupKey : siteSettings.Id.ToString()
                    ).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                _log.LogError("error sending password reset email: " + ex.Message + " stacktrace: " + ex.StackTrace);
            }
        }
Beispiel #3
0
 public async Task SendPasswordReset(PasswordResetEmailViewModel viewModel)
 {
     await SendEmail(viewModel);
 }
Beispiel #4
0
 public async Task SendPasswordReset(PasswordResetEmailViewModel viewModel)
 {
     await Task.Run(() => _logger.LogInformation($"PASSWORD RESET Email sent to {viewModel.EmailAddress} with returnUrl {viewModel.LoginLink}"));
 }