public ActionResult SendVerificationLink([Bind(Prefix = "sendVerificationLinkModel")] SendVerificationLinkModel model) { try { // If the user model is valid and the user exists if (!ModelState.IsValid) { // Return the user to the home page return(CurrentUmbracoPage()); } // Get a handle on the member var member = Services.MemberService.GetByUsername(model.UserName); if (member == null) { // If the user doesn't exists, check the HRI API to see if this is a returning IWS user var currentUmbracoPage = InitiateSecurityUpgradeForIwsUser("sendVerificationLinkModel", model.UserName); if (currentUmbracoPage != null) { return(currentUmbracoPage); } // There is an API error ModelState.AddModelError("sendVerificationLinkModel", UsernameDoesNotExist); return(CurrentUmbracoPage()); } if (member.IsApproved) { if (!Roles.IsUserInRole(model.UserName, "Registered")) { // User is in process of security upgrade return(SendResetPasswordEmailAndRedirectToSecurityUpgradePage(model.UserName)); } TempData["ResendEmailAlreadyVerified"] = true; return(CurrentUmbracoPage()); } // Create a random Guid Guid key = Guid.NewGuid(); // Update the user's Guid field member.SetValue("guid", key.ToString()); // Save the updated information Services.MemberService.Save(member); // Get ahold of the root/home node IPublishedContent root = Umbraco.ContentAtRoot().First(); // Get the id of the user // Get the Verification Email Template ID var emailTemplateId = root.GetProperty("verificationEmailTemplate").Value; var protocol = Request.IsSecureConnection ? "https" : "http"; // Build a dictionary for all the dynamic text in the email template var dynamicText = new Dictionary <string, string> { { "<%FirstName%>", member.GetValue("firstName").ToString() }, { "<%PhoneNumber%>", root.GetProperty("phoneNumber").Value.ToString() }, { "<%VerificationUrl%>", protocol + "://" + Request.Url.Host + ":" + Request.Url.Port + "/umbraco/Surface/MembersSurface/ActivateUser?id=" + member.Id + "&guid=" + key } }; // Try to send the message try { SendEmail(member.Email, "Health Republic Insurance - Member Verification Link", BuildEmail((int)emailTemplateId, dynamicText)); } catch (SmtpException ex) { // Create an error message with sufficient info to contact the user string additionalInfo = "Failed to send verification link to user" + model.UserName + " due to a the SMTP server failing."; // Add the error message to the log4net output log4net.GlobalContext.Properties["additionalInfo"] = additionalInfo; // Log the error logger.Error("Unable to send verification link.", ex); //don't add a field level error, just model level ModelState.AddModelError("sendVerificationLinkModel", ex.Message + "\n" + ex.InnerException.Message + "\n"); return(CurrentUmbracoPage()); } // Mark this method as successful for the next page TempData["IsSuccessful"] = true; // If there is a redirect url return(Redirect(!string.IsNullOrEmpty(model.RedirectUrl) ? model.RedirectUrl : "/")); } catch (Exception ex) { // Create an error message with sufficient info to contact the user string additionalInfo = "Could not send a verification link to user " + model.UserName + "."; // Add the error message to the log4net output log4net.GlobalContext.Properties["additionalInfo"] = additionalInfo; // Log the error logger.Error("Unable to send verification link.", ex); TempData["IsSuccessful"] = false; return(CurrentUmbracoPage()); } }
public ActionResult SendVerificationLink_GET(SendVerificationLinkModel model) { if (ModelState.IsValid && Services.MemberService.GetByUsername(model.UserName) != null) { // Get a handle on the member var member = Services.MemberService.GetByUsername(model.UserName); // Create a random Guid var key = Guid.NewGuid(); // Update the user's Guid field member.SetValue("guid", key.ToString()); // Save the updated information Services.MemberService.Save(member); // Get ahold of the root/home node IPublishedContent root = Umbraco.ContentAtRoot().First(); // Get the Verification Email Template ID var emailTemplateId = root.GetProperty("verificationEmailTemplate").Value; // Build a dictionary for all the dynamic text in the email template var dynamicText = new Dictionary <string, string> { { "<%FirstName%>", member.GetValue("firstName").ToString() }, { "<%PhoneNumber%>", root.GetProperty("phoneNumber").Value.ToString() }, { "<%VerificationUrl%>", root.GetProperty("HostUrl").Value.ToString() + "/umbraco/Surface/MembersSurface/ActivateUser?id=" + member.Id + "&guid=" + key.ToString() } }; // Try to send the message try { SendEmail(member.Email, "Health Republic Insurance - Member Verification Link", BuildEmail((int)emailTemplateId, dynamicText)); } catch (SmtpException ex) { //don't add a field level error, just model level ModelState.AddModelError("sendVerificationLinkModel", ex.Message + "\n" + ex.InnerException.Message + "\n"); return(Redirect("/for-members/register")); } // Mark this method as successful for the next page TempData["IsSuccessful"] = true; // If there is a redirect url if (!string.IsNullOrEmpty(model.RedirectUrl)) { // Send the user to that page return(Redirect(model.RedirectUrl)); } // Otherwise send the user to the home page return(Redirect("/")); } // Model was bad or user didnt exist // Mark the method as failed TempData["IsSuccessful"] = false; // Return the user to the home page return(Redirect("/")); }
public ActionResult HandleRegisterMember([Bind(Prefix = "registerModel")] RegisterFormViewModel model) { try { // Save Plan Id for the view ViewData["PlanId"] = model.PlanId; var enrollAfterLogin = Convert.ToInt32(model.PlanId != null).ToString(); // Check the Member Id (Y number) if (model.PlanId == null) // Enrolled user { ModelState.Remove("registerModel.Zipcode"); var errorMessage = ValidateMemberIdCore(model.MemberId, model.DateOfBirth, true); if (errorMessage != null) { ModelState.AddModelError("registerModel.MemberId", errorMessage); } // check if yNumber is already registered in umbraco var registeredUsername = GetMemberRegisteredUsernameWithYNumber(model.MemberId); if (registeredUsername != null) { ModelState.AddModelError("registerModel.MemberId", "The Member ID you have entered is registered with existing user name: " + registeredUsername); } // if there's no error, try to get plan ID from api var planId = MakeInternalApiCall <string>("GetHealthPlanIdByMemberId", new Dictionary <string, string> { { "memberId", model.MemberId } }); if (planId != null) { ViewData["PlanId"] = model.PlanId; model.PlanId = planId; } } else { // is new user // Validate ZipCode if (!ComparePlansSurfaceController.IsValidZipCodeInternal(model.Zipcode)) { ModelState.AddModelError("registerModel.Zipcode", "Invalid Zip Code"); } } if (!ModelState.IsValid) { return(CurrentUmbracoPage()); } // Create registration model and bind it with view model var registerModel = RegisterModel.CreateModel(); registerModel.Name = model.Username.Trim(); registerModel.UsernameIsEmail = false; registerModel.Email = model.Email.Trim(); registerModel.Username = model.Username.Trim(); registerModel.Password = model.Password.Trim(); registerModel.RedirectUrl = "for-members/verify-account/"; registerModel.MemberProperties.Add(new UmbracoProperty { Alias = "firstName", Value = model.FirstName.Trim() }); registerModel.MemberProperties.Add(new UmbracoProperty { Alias = "lastName", Value = model.LastName.Trim() }); registerModel.MemberProperties.Add(new UmbracoProperty { Alias = "ssn", Value = model.Ssn.TrimNullable() }); registerModel.MemberProperties.Add(new UmbracoProperty { Alias = "zipCode", Value = model.Zipcode.TrimNullable() }); registerModel.MemberProperties.Add(new UmbracoProperty { Alias = "phoneNumber", Value = model.Phone.TrimNullable() }); registerModel.MemberProperties.Add(new UmbracoProperty { Alias = "yNumber", Value = model.MemberId.TrimNullable() }); registerModel.MemberProperties.Add(new UmbracoProperty { Alias = "healthplanid", Value = model.PlanId.TrimNullable() }); registerModel.MemberProperties.Add(new UmbracoProperty { Alias = "enrollmentpageafterlogin", Value = enrollAfterLogin }); MembershipCreateStatus status; Members.RegisterMember(registerModel, out status, false); switch (status) { case MembershipCreateStatus.Success: // Sign the user out (Umbraco wont stop auto logging in - this is a hack to fix) Session.Clear(); FormsAuthentication.SignOut(); // Set the user to be not approved var memb = Membership.GetUser(model.Username); memb.IsApproved = false; Membership.UpdateUser(memb); // Send the user a verification link to activate their account var sendVerificationLinkModel = new SendVerificationLinkModel(); sendVerificationLinkModel.UserName = model.Username; sendVerificationLinkModel.RedirectUrl = "/for-members/verify-account/"; return(RedirectToAction("SendVerificationLink_GET", "EmailSurface", sendVerificationLinkModel)); case MembershipCreateStatus.InvalidUserName: ModelState.AddModelError("registerModel.Username", "Username is not valid"); break; case MembershipCreateStatus.InvalidPassword: ModelState.AddModelError("registerModel.Password", PasswordNotStrongEnough); break; case MembershipCreateStatus.InvalidQuestion: case MembershipCreateStatus.InvalidAnswer: //TODO: Support q/a http://issues.umbraco.org/issue/U4-3213 throw new NotImplementedException(status.ToString()); case MembershipCreateStatus.InvalidEmail: ModelState.AddModelError("registerModel.Email", "Email is invalid"); break; case MembershipCreateStatus.DuplicateUserName: ModelState.AddModelError("registerModel.Username", "A member with this username already exists"); break; case MembershipCreateStatus.DuplicateEmail: 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: //don't add a field level error, just model level ModelState.AddModelError("registerModel", "An error occurred creating the member: " + status); break; default: throw new ArgumentOutOfRangeException(); } return(CurrentUmbracoPage()); } catch (Exception ex) { // Create an error message with sufficient info to contact the user string additionalInfo = "Could not register user " + model.Username + "."; // Add the error message to the log4net output log4net.GlobalContext.Properties["additionalInfo"] = additionalInfo; return(CurrentUmbracoPage()); } }