Recaptcha for contact and registration page implemented

This commit is contained in:
2022-10-21 14:43:33 -04:00
parent 0160c1d7b5
commit 8fd0796019
10 changed files with 155 additions and 42 deletions
+13 -4
View File
@@ -11,21 +11,30 @@ namespace LeafWeb.WebCms.Controllers
public ActionResult Index()
{
var viewModel = new ContactForm();
return PartialView(viewModel);
// if user is logged in, pre fill the name and email
var member = Members.GetCurrentMember();
if (member != null)
{
viewModel.Name = member.Name;
viewModel.Email= (string)member.GetProperty("Email").Value;
}
return PartialView(viewModel);
}
[HttpPost]
[ValidateRecaptcha]
public ActionResult Submit(ContactForm viewModel)
{
if (ModelState.IsValid) // HttpParamMatch indicates it's backing out from Confirm
if (ModelState.IsValid)
{
BackgroundJob.Enqueue<EmailNotificationService>(
BackgroundJob.Enqueue<EmailNotificationService>(
e => e.SendContactEmail(viewModel));
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);
SetStatusMessage($"Thank you, {viewModel.Name}. Your message has been sent" , StatusType.Success);
return RedirectToCurrentUmbracoPage();
}
+59
View File
@@ -0,0 +1,59 @@
using System;
using System.Web.Mvc;
using System.Web.Security;
using Umbraco.Core;
using Umbraco.Web.Models;
using Umbraco.Web.Mvc;
namespace LeafWeb.WebCms.Controllers
{
public class RegisterController : BaseController
{
[HttpPost]
//[ValidateAntiForgeryToken]
[ValidateRecaptcha]
[ValidateUmbracoFormRouteString]
public ActionResult HandleRegisterMember([Bind(Prefix = "registerModel")] RegisterModel model)
{
if (!this.ModelState.IsValid)
return (ActionResult)this.CurrentUmbracoPage();
if (string.IsNullOrEmpty(model.Name) && !string.IsNullOrEmpty(model.Email))
model.Name = model.Email;
MembershipCreateStatus status;
this.Members.RegisterMember(model, out status, model.LoginOnSuccess);
switch (status)
{
case MembershipCreateStatus.Success:
this.TempData["FormSuccess"] = (object)true;
return !model.RedirectUrl.IsNullOrWhiteSpace() ? (ActionResult)this.Redirect(model.RedirectUrl) : (ActionResult)this.RedirectToCurrentUmbracoPage();
case MembershipCreateStatus.InvalidUserName:
this.ModelState.AddModelError(model.UsernameIsEmail || model.Username == null ? "registerModel.Email" : "registerModel.Username", "Username is not valid");
break;
case MembershipCreateStatus.InvalidPassword:
this.ModelState.AddModelError("registerModel.Password", "The password is not strong enough");
break;
case MembershipCreateStatus.InvalidQuestion:
case MembershipCreateStatus.InvalidAnswer:
throw new NotImplementedException(status.ToString());
case MembershipCreateStatus.InvalidEmail:
this.ModelState.AddModelError("registerModel.Email", "Email is invalid");
break;
case MembershipCreateStatus.DuplicateUserName:
this.ModelState.AddModelError(model.UsernameIsEmail || model.Username == null ? "registerModel.Email" : "registerModel.Username", "A member with this username already exists.");
break;
case MembershipCreateStatus.DuplicateEmail:
this.ModelState.AddModelError("registerModel.Email", "A member with this e-mail address already exists");
break;
case MembershipCreateStatus.UserRejected:
case MembershipCreateStatus.InvalidProviderUserKey:
case MembershipCreateStatus.DuplicateProviderUserKey:
case MembershipCreateStatus.ProviderError:
this.ModelState.AddModelError("registerModel", "An error occurred creating the member: " + (object)status);
break;
default:
throw new ArgumentOutOfRangeException();
}
return (ActionResult)this.CurrentUmbracoPage();
}
}
}
@@ -0,0 +1,30 @@
using System.Linq;
using System.Web;
using System.Web.Http.Results;
using System.Web.Mvc;
using hbehr.recaptcha;
using log4net;
using Umbraco.Web.Mvc;
namespace LeafWeb.WebCms.Controllers
{
public class ValidateRecaptchaAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context != null)
{
//https://github.com/henriqb/ReCaptcha-Asp-Net
//https://stackoverflow.com/questions/58328542/trying-the-samesite-attribute-fix-for-the-google-recaptcha-v2-warning-on-chrome
var userResponse = context.RequestContext.HttpContext.Request.Params["g-recaptcha-response"];
var validCaptcha = userResponse != null && ReCaptcha.ValidateCaptcha(userResponse);
if (!validCaptcha)
{
context.Result = new System.Web.Mvc.RedirectResult("/error");
}
}
base.OnActionExecuting(context);
}
}
}