public async Task <IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return(Page());
            }

            var user = await _userManager.FindByEmailAsync(Input.Email);

            if (user == null)
            {
                ModelState.AddModelError(string.Empty, "Verification email sent. Please check your email.");
                return(Page());
            }

            var userId = await _userManager.GetUserIdAsync(user);

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { userId, code },
                protocol: Request.Scheme);
            await ToupiaoEmailSender.SendEmailAnync(
                _configuration,
                Input.Email,
                "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            ModelState.AddModelError(string.Empty, "Verification email sent. Please check your email.");
            return(Page());
        }
        public async Task <IActionResult> OnPostAsync()
        {
            if (ModelState.IsValid)
            {
                var user = await _userManager.FindByEmailAsync(Input.Email);

                if (user == null || !(await _userManager.IsEmailConfirmedAsync(user)))
                {
                    // Don't reveal that the user does not exist or is not confirmed
                    return(RedirectToPage("./ForgotPasswordConfirmation"));
                }

                // For more information on how to enable account confirmation and password reset please
                // visit https://go.microsoft.com/fwlink/?LinkID=532713
                var code = await _userManager
                           .GeneratePasswordResetTokenAsync(user);

                code = WebEncoders
                       .Base64UrlEncode(Encoding.UTF8.GetBytes(code));

                var callbackUrl = Url.Page(
                    "/Account/ResetPassword",
                    pageHandler: null,
                    values: new { area = "Identity", code },
                    protocol: Request.Scheme);

                await ToupiaoEmailSender.SendEmailAnync(
                    _configuration,
                    Input.Email,
                    "Reset Password",
                    $"Please reset your password by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                return(RedirectToPage("./ForgotPasswordConfirmation"));
            }

            return(Page());
        }
Example #3
0
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");

            if (ModelState.IsValid)
            {
                var _user = await _userManager.FindByEmailAsync(Input.Email);

                if (_user == null)
                {
                    return(RedirectToPage("Register", new { IsFromLogin = true, returnUrl }));
                }

                if (!await _userManager.IsEmailConfirmedAsync(_user))
                {
                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(_user);

                    code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));

                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { area = "Identity", userId = _user.Id, code = code },
                        protocol: Request.Scheme);

                    await ToupiaoEmailSender.SendEmailAnync(
                        _configuration,
                        Input.Email,
                        _localizer["确认你的电子邮件"],
                        _localizer["请确认您的帐户"] + " <a href='" + HtmlEncoder.Default.Encode(callbackUrl) + "'>" + _localizer["点击这里"] + "</a>");

                    ModelState.AddModelError(string.Empty, _localizer["邮件已发送!请确认后可以登录"]);
                    return(Page());
                }

                // 通过邮箱来获取用户名
                var _UserName = _userManager.FindByEmailAsync(Input.Email)
                                .GetAwaiter().GetResult().UserName;


                // This doesn't count login failures towards account lockout
                // To enable password failures to trigger account lockout, set lockoutOnFailure: true
                var result = await _signInManager.PasswordSignInAsync(
                    _UserName,
                    Input.Password,
                    Input.RememberMe,
                    lockoutOnFailure : false);

                // 登录成功
                if (result.Succeeded)
                {
                    _logger.LogInformation("User logged in.");

                    if (_context.Users.Count() == 1)
                    {
                        // 第一个用户为管理员
                        if (!await _context.Roles.AnyAsync(
                                p => p.Name == "ADMIN"))
                        {
                            var role = new IdentityRole
                            {
                                Name           = "ADMIN",
                                NormalizedName = "ADMIN"
                            };

                            await _roleManager.CreateAsync(role);

                            await _context.SaveChangesAsync();
                        }

                        if (!User.IsInRole("ADMIN"))
                        {
                            await _userManager.AddToRolesAsync(
                                _user, new[] { "ADMIN" });

                            await _context.SaveChangesAsync();

                            _logger.LogInformation(
                                $"User: {_user.Email} is ADMIN now");
                        }
                    }

                    if (User.IsInRole("ADMIN"))
                    {
                        Response.Cookies.Append(
                            key: "IsAdmin",
                            value: "1",
                            options: new CookieOptions()
                        {
                            Expires = DateTime.Now.AddYears(1)
                        });
                    }

                    return(LocalRedirect(returnUrl));
                }
                if (result.RequiresTwoFactor)
                {
                    return(RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe }));
                }
                if (result.IsLockedOut)
                {
                    _logger.LogWarning("用户帐户被锁定。");
                    return(RedirectToPage("./Lockout"));
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "账号或者密码错误!");
                    return(Page());
                }
            }

            // If we got this far, something failed, redisplay form
            return(Page());
        }
Example #4
0
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl      = returnUrl ?? Url.Content("~/");
            ExternalLogins = (await _signInManager
                              .GetExternalAuthenticationSchemesAsync()).ToList();

            if (ModelState.IsValid)
            {
                var user = new IdentityUser {
                    UserName = Input.Email,
                    Email    = Input.Email
                };

                var result = await _userManager.CreateAsync(
                    user,
                    Input.Password);

                if (result.Succeeded)
                {
                    _logger.LogInformation(
                        "User created a new account with password.");

                    var code = await _userManager
                               .GenerateEmailConfirmationTokenAsync(user);

                    code = WebEncoders.Base64UrlEncode(
                        Encoding.UTF8.GetBytes(code));

                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new {
                        area   = "Identity",
                        userId = user.Id,
                        code   = code
                    },
                        protocol: Request.Scheme);

                    await ToupiaoEmailSender.SendEmailAnync(
                        _configuration,
                        Input.Email,
                        _localizer["Confirm your email"],
                        _localizer[$"Please confirm your account by"] +
                        $"<a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>"
                        + _localizer["clicking here"] +
                        "</a>.");

                    if (_userManager.Options.SignIn.RequireConfirmedAccount)
                    {
                        return(RedirectToPage("RegisterConfirmation", new { email = Input.Email }));
                    }
                    else
                    {
                        await _signInManager.SignInAsync(user, isPersistent : false);

                        return(LocalRedirect(returnUrl));
                    }
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return(Page());
        }