Password reset

This commit is contained in:
2020-01-26 09:05:54 -05:00
parent 4c51a72544
commit 8ca5105fca
19 changed files with 398 additions and 38 deletions
+4 -3
View File
@@ -1,4 +1,5 @@
using System.Web.Mvc;
using Hangfire;
using log4net;
using LeafWeb.WebCms.Models;
using LeafWeb.WebCms.Services;
@@ -18,10 +19,10 @@ namespace LeafWeb.WebCms.Controllers
{
if (ModelState.IsValid) // HttpParamMatch indicates it's backing out from Confirm
{
// convert viewModel into Model
new EmailNotificationService().SendContactEmail(viewModel);
BackgroundJob.Enqueue<EmailNotificationService>(
e => e.SendContactEmail(viewModel));
var logger = LogManager.GetLogger(GetType());
var logger = LogManager.GetLogger(GetType());
logger.Info($"Contact: Name:{viewModel.Name} Added, Email:{viewModel.Email}, Message:{viewModel.Message}");
SetStatusMessage("Your message has been sent!", StatusType.Success);
+8 -1
View File
@@ -6,5 +6,12 @@ namespace LeafWeb.WebCms.Controllers
public const int ManageQueue = 1107;
public const int Chart = 1100;
public const int Details = 1111;
}
public const int PasswordResetRequest = 1164;
}
public static class LeafWebMemberProperties
{
public const string VerificationToken = "VerificationToken";
public const string PasswordResetToken = "PasswordResetToken";
}
}
+138 -2
View File
@@ -1,4 +1,8 @@
using System.Web.Mvc;
using Hangfire;
using LeafWeb.WebCms.Models;
using LeafWeb.WebCms.Services;
using MlkPwgen;
using Umbraco.Core;
namespace LeafWeb.WebCms.Controllers
@@ -23,7 +27,7 @@ namespace LeafWeb.WebCms.Controllers
}
else
{
var storedToken = member.GetValue("VerificationToken") as string;
var storedToken = member.GetValue<string>(LeafWebMemberProperties.VerificationToken);
if (string.IsNullOrEmpty(storedToken))
{
@@ -41,7 +45,7 @@ namespace LeafWeb.WebCms.Controllers
member.IsApproved = true;
// remove the verification
member.SetValue("VerificationToken", string.Empty);
member.SetValue(LeafWebMemberProperties.VerificationToken, string.Empty);
memberService.Save(member);
TempData["StatusMessage"] = "Thank you! Your email is now verified at " + member.Email;
@@ -53,5 +57,137 @@ namespace LeafWeb.WebCms.Controllers
return Redirect(redirectUrl);
}
public ActionResult PasswordResetRequest()
{
var viewModel = new PasswordResetRequestForm();
return PartialView("PasswordResetRequest", viewModel);
}
[HttpPost]
public ActionResult PasswordResetRequest(PasswordResetRequestForm requestForm)
{
if (!ModelState.IsValid)
return CurrentUmbracoPage();
var memberService = ApplicationContext.Current.Services.MemberService;
var member = memberService.GetByEmail(requestForm.Email);
if (member == null)
{
// Send notification of attempt to change
BackgroundJob.Enqueue<EmailNotificationService>(
e => e.SendPasswordResetNotMemberEmail(requestForm.Email));
}
else
{
var token = PasswordGenerator.Generate(12, allowed: "0123456789");
member.SetValue(LeafWebMemberProperties.PasswordResetToken, token);
memberService.Save(member);
// Send Email
BackgroundJob.Enqueue<EmailNotificationService>(
e => e.SendPasswordResetEmail(member.Email));
}
// don't acknowledge their email address
TempData["StatusMessage"] =
$"An email has been sent to {requestForm.Email} with instructions on how to reset your password.";
TempData["StatusMessage-Type"] = "alert-success";
return Redirect("/");
}
public ActionResult PasswordReset(string email, string token)
{
var errorMsg = $"Sorry, a valid password reset was not found for user {email}. " +
$"Please try resetting again, " +
$"or use Contact Us if the issue persists.";
if (!string.IsNullOrEmpty(email) && !string.IsNullOrEmpty(token))
{
var memberService = ApplicationContext.Current.Services.MemberService;
var member = memberService.GetByEmail(email);
if (member == null)
{
// don't acknowledge their email address
TempData["StatusMessage"] = errorMsg;
TempData["StatusMessage-Type"] = "alert-danger";
}
else
{
var storedToken = member.GetValue<string>(LeafWebMemberProperties.PasswordResetToken);
if (string.IsNullOrEmpty(storedToken))
{
TempData["StatusMessage"] = errorMsg;
TempData["StatusMessage-Type"] = "alert-danger";
}
else if (storedToken != token)
{
TempData["StatusMessage"] = errorMsg;
TempData["StatusMessage-Type"] = "alert-danger";
}
else
{
var viewModel = new PasswordResetForm {Email = email, PasswordResetToken = token};
return PartialView(viewModel);
}
}
}
return PasswordResetRequest();
}
[HttpPost]
public ActionResult PasswordReset(PasswordResetForm form)
{
var redirectUrl = "/";
var errorMsg = $"Sorry, a valid password reset was not found for user {form.Email}. " +
$"Please try resetting again, " +
$"or use Contact Us if the issue persists.";
if (ModelState.IsValid)
{
var memberService = ApplicationContext.Current.Services.MemberService;
var member = memberService.GetByEmail(form.Email);
if (member == null)
{
// don't acknowledge their email address
TempData["StatusMessage"] = errorMsg;
TempData["StatusMessage-Type"] = "alert-danger";
}
else
{
var storedToken = member.GetValue<string>(LeafWebMemberProperties.PasswordResetToken);
if (string.IsNullOrEmpty(storedToken))
{
TempData["StatusMessage"] = errorMsg;
TempData["StatusMessage-Type"] = "alert-danger";
}
else if (storedToken != form.PasswordResetToken)
{
TempData["StatusMessage"] = errorMsg;
TempData["StatusMessage-Type"] = "alert-danger";
}
else
{
memberService.SavePassword(member, form.Password);
// remove the token
member.SetValue(LeafWebMemberProperties.PasswordResetToken, string.Empty);
memberService.Save(member);
TempData["StatusMessage"] = "Password updated for " + member.Email + ", use your new password to login.";
TempData["StatusMessage-Type"] = "alert-success";
redirectUrl = "membership/login";
}
}
}
return Redirect(redirectUrl);
}
}
}