public async Task <ActionResult> Register(RegisterViewModel model, [FromForm(Name = "g-recaptcha-response")] string recaptchaToken)
        {
            var isRecaptchaConfigured = recaptchaVerificator.IsRecaptchaConfigured();

            if (!ModelState.IsValid)
            {
                model.IsRecaptchaConfigured = isRecaptchaConfigured;
                model.RecaptchaPublicKey    = recaptchaOptions.Value.PublicKey;
                return(View(model));
            }

            //this can be null i.e. under proxy or from localhost.
            //TODO IISIntegration, etc
            var clientIp = HttpContext.Connection.RemoteIpAddress;

            if (isRecaptchaConfigured)
            {
                var isRecaptchaValid = await recaptchaVerificator.ValidateToken(recaptchaToken, clientIp);

                if (!isRecaptchaValid)
                {
                    ModelState.AddModelError("captcha", "Невозможно верифицировать ReCAPTCHA. Если эта ошибка повторяется, пожалуйста, обратитесь в техподдержку.");
                    model.IsRecaptchaConfigured = isRecaptchaConfigured;
                    model.RecaptchaPublicKey    = recaptchaOptions.Value.PublicKey;
                    return(View(model));
                }
            }

            var currentUser = await UserManager.FindByNameAsync(model.Email);

            if (currentUser != null)
            {
                ModelState.AddModelError("",
                                         "Вы уже зарегистрировались. Если пароль не подходит, нажмите «Забыли пароль?»");
                var loginModel = await CreateLoginPageViewModelAsync("");

                loginModel.Login.Email = model.Email;
                return(View("Login", loginModel));
            }

            var user = new JoinIdentityUser {
                UserName = model.Email
            };
            var result = await UserManager.CreateAsync(user, model.Password);

            if (!result.Succeeded)
            {
                ModelState.AddErrors(result);
                model.IsRecaptchaConfigured = isRecaptchaConfigured;
                model.RecaptchaPublicKey    = recaptchaOptions.Value.PublicKey;
                return(View(model));
            }

            //We don't want to sign in user until he has email confirmed
            //await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

            await SendConfirmationEmail(user);

            return(View("RegisterSuccess"));
        }
示例#2
0
        public async Task <ActionResult> ExternalLoginConfirmation(
            ExternalLoginConfirmationViewModel model)
        {
            if (User.Identity?.IsAuthenticated == true)
            {
                return(RedirectToAction("Index", "Manage"));
            }

            if (ModelState.IsValid)
            {
                // Get the information about the user from the external login provider
                var loginInfo = await SignInManager.GetExternalLoginInfoAsync();

                if (loginInfo == null)
                {
                    return(View("ExternalLoginFailure"));
                }

                var email = loginInfo.Principal.FindFirstValue(ClaimTypes.Email);

                var user = new JoinIdentityUser()
                {
                    UserName = email
                };
                var result = await UserManager.CreateAsync(user);

                if (result.Succeeded)
                {
                    result = await UserManager.AddLoginAsync(user, loginInfo);

                    if (result.Succeeded)
                    {
                        var token = await UserManager.GenerateEmailConfirmationTokenAsync(user);

                        _ = await UserManager.ConfirmEmailAsync(user, token);

                        await SignInManager.SignInAsync(user, isPersistent : true);

                        await externalLoginProfileExtractor.TryExtractProfile(user, loginInfo);

                        return(RedirectToLocal(model.ReturnUrl));
                    }
                }

                ModelState.AddErrors(result);
            }

            return(View(model));
        }
        public async Task <ActionResult> Register(RegisterViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            var currentUser = await UserManager.FindByNameAsync(model.Email);

            if (currentUser != null)
            {
                ModelState.AddModelError("",
                                         "Вы уже зарегистрировались. Если пароль не подходит, нажмите «Забыли пароль?»");
                return(View("Login", new LoginViewModel()
                {
                    Email = model.Email
                }));
            }

            var passValidateResult =
                await UserManager.PasswordValidator.ValidateAsync(model.Password);

            if (!passValidateResult.Succeeded)
            {
                ModelState.AddErrors(passValidateResult);
                return(View(model));
            }

            var user = new JoinIdentityUser {
                UserName = model.Email
            };
            var result = await UserManager.CreateAsync(user);

            if (!result.Succeeded)
            {
                ModelState.AddErrors(result);
                return(View(model));
            }

            //We don't want to sign in user until he has email confirmed
            //await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

            await UserManager.SetPasswordWithoutValidationAsync(user.Id, model.Password);

            await SendConfirmationEmail(user);

            return(View("RegisterSuccess"));
        }
示例#4
0
        private async Task SendConfirmationEmail(JoinIdentityUser user)
        {
            var code = await UserManager.GenerateEmailConfirmationTokenAsync(user);

            var callbackUrl = Url.Action("ConfirmEmail",
                                         "Account",
                                         new { userId = user.UserId, code },
                                         protocol: Request.Scheme);

            //TODO we need to reconsider interface for email service to unbound EmailService from User objects.
            var dbUser = await UserRepository.GetById(user.UserId);

            await _emailService.Email(new ConfirmEmail()
            {
                CallbackUrl = callbackUrl, Recipient = dbUser
            });
        }
        public async Task <ActionResult> ExternalLoginConfirmation(
            ExternalLoginConfirmationViewModel model,
            string returnUrl)
        {
            if (User.Identity.IsAuthenticated)
            {
                return(RedirectToAction("Index", "Manage"));
            }

            if (ModelState.IsValid)
            {
                // 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 JoinIdentityUser()
                {
                    UserName = 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 : true,
                                                        rememberBrowser : false);

                        return(RedirectToLocal(returnUrl));
                    }
                }

                ModelState.AddErrors(result);
            }

            ViewBag.ReturnUrl = returnUrl;
            return(View(model));
        }
示例#6
0
 public static Task <ClaimsIdentity> GenerateUserIdentityAsync(this JoinIdentityUser user,
                                                               UserManager <JoinIdentityUser, int> manager,
                                                               string authenticationType)
 {
     return(manager.ClaimsIdentityFactory.CreateAsync(manager, user, authenticationType));
 }