public async Task <ActionResult> SendEmailConfirmationCode(ConfirmEmailViewModel confirmEmailViewModel) { if (!ModelState.IsValid) { return(View()); } List <Claim> claims = new List <Claim>() { new Claim(WellKnown.ConfirmEmailViewModelClaim, JsonConvert.SerializeObject(confirmEmailViewModel)) }; var now = DateTime.UtcNow; var lifetime = new Lifetime(now, now.AddMinutes(30)); var jwt = IdentityTokenHelper.BuildJWT(claims, WellKnown.ValidIssuer, WellKnown.EmailConfirmationAudience, lifetime); var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = confirmEmailViewModel.UserId, code = jwt }, protocol: Request.Url.Scheme); await UserManager.EmailService.SendAsync(new IdentityMessage() { Destination = confirmEmailViewModel.Email, Subject = "Confirm your account!", Body = "You have 30 minutes to confirm your account by clicking here: " + callbackUrl }); // Generate the token and send it return(RedirectToAction("EmailConfirmationSent", "Account", new { email = confirmEmailViewModel.Email })); }
public async Task <ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl) { if (User.Identity.IsAuthenticated) { return(RedirectToAction("Index", "Manage")); } if (ModelState.IsValid) { var loginInfo = Session["UserLoginInfo"] as UserLoginInfo; if (loginInfo == null) { return(RedirectToAction("Login", "Account")); } List <Claim> claims = new List <Claim>() { new Claim(WellKnown.ConfirmEmailViewModelClaim, JsonConvert.SerializeObject(new ConfirmEmailViewModel() { ConfirmEmailPurpose = ConfirmEmailPurpose.ConfirmEmailPurpose_CreateExternalAccount, Email = model.Email })), new Claim(WellKnown.UserLoginInfoClaim, JsonConvert.SerializeObject(loginInfo)), }; var now = DateTime.UtcNow; var lifetime = new Lifetime(now, now.AddMinutes(30)); var jwt = IdentityTokenHelper.BuildJWT(claims, WellKnown.ValidIssuer, WellKnown.EmailConfirmationAudience, lifetime); var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = "na", code = jwt }, protocol: Request.Url.Scheme); await UserManager.EmailService.SendAsync(new IdentityMessage() { Destination = model.Email, Subject = "Confirm your account!", Body = "You have 30 minutes to confirm your account by clicking here: " + callbackUrl }); return(RedirectToAction("EmailConfirmationSent", "Account", new { email = model.Email })); // await UserManager.SendEmailAsync(userId, "Confirm your account", "You have 30 minutes to confirm your account by clicking here: " + callbackUrl); /* * * // Get the information about the user from the external login provider * var info = await AuthenticationManager.GetExternalLoginInfoAsync(); * if (info == null) * { * return View("ExternalLoginFailure"); * } * var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; * var result = await UserManager.CreateAsync(user); * if (result.Succeeded) * { * result = await UserManager.AddLoginAsync(user.Id, info.Login); * if (result.Succeeded) * { * await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); * return RedirectToLocal(returnUrl); * } * } * AddErrors(result); */ } ViewBag.ReturnUrl = returnUrl; return(View(model)); }
public async Task <ActionResult> ConfirmEmail(string userId, string code) { if (code == null) { return(View("Error")); } var validationParameters = new TokenValidationParameters() { ValidAudiences = new[] { WellKnown.EmailConfirmationAudience }, IssuerSigningToken = new BinarySecretSecurityToken(IdentityTokenHelper.EncryptionKey), ValidIssuer = WellKnown.ValidIssuer, ValidateLifetime = true }; SecurityToken securityToken; var principal = IdentityTokenHelper.ValidateJWT(code, validationParameters, out securityToken); var query = from item in principal.Claims where item.Type == WellKnown.ConfirmEmailViewModelClaim select item; if (!query.Any()) { return(View("Error")); } var confirmEmailViewModel = JsonConvert.DeserializeObject <ConfirmEmailViewModel>(query.Single().Value); if (confirmEmailViewModel.ConfirmEmailPurpose == ConfirmEmailPurpose.ConfirmEmailPurpose_CreateLocalAccount) { Session[WellKnown.ConfirmEmailViewModelClaim] = confirmEmailViewModel; return(await OnboardVerifiedEmail()); } // Optional. If this is not here, we simply attempt an email confirmation on an existing query = from item in principal.Claims where item.Type == WellKnown.UserLoginInfoClaim select item; UserLoginInfo userLoginInfo = null; if (query.Any()) { userLoginInfo = JsonConvert.DeserializeObject <UserLoginInfo>(query.Single().Value); } // if the user exists, then simply do an email confirmation on this. var user = await UserManager.FindByEmailAsync(confirmEmailViewModel.Email); if (user != null) { if (!user.EmailConfirmed) { user.EmailConfirmed = true; await UserManager.UpdateAsync(user); } return(View("ConfirmEmail")); } if (userLoginInfo != null) { // User does not exist, and we have an email confirmation, so lets create user = new ApplicationUser { UserName = confirmEmailViewModel.Email, Email = confirmEmailViewModel.Email, EmailConfirmed = true }; var createResult = await UserManager.CreateAsync(user); if (createResult.Succeeded) { createResult = await UserManager.AddLoginAsync(user.Id, userLoginInfo); } AddErrors(createResult); return(View(createResult.Succeeded ? "ConfirmEmail" : "Error")); } return(View("Error")); }