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); } }
public async Task SendPasswordReset(PasswordResetEmailViewModel viewModel) { await SendEmail(viewModel); }
public async Task SendPasswordReset(PasswordResetEmailViewModel viewModel) { await Task.Run(() => _logger.LogInformation($"PASSWORD RESET Email sent to {viewModel.EmailAddress} with returnUrl {viewModel.LoginLink}")); }