Exemplo n.º 1
0
        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 }));
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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"));
        }