如何让用户在首次登录后更改其密码

本文关键字:密码 登录 用户 | 更新日期: 2023-09-27 18:37:19

我创建的网站需要管理员帐户为用户创建帐户。我将如何让这些用户在首次登录后更改密码?问题是用户在决定首次登录后将为其指定一个通用密码,我希望他们必须将密码更改为不那么通用的密码。

这是我的登录控制器

  [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }
    //
    // POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.UserName, model.Password);
            if (user != null)
            {
                await SignInAsync(user, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }

我的登录模型

 public class LoginViewModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }
    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }
    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }

}

和风景

 <div class="container">
    <div class="col-md-8">
        <section id="loginForm">
            @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
            {
                @Html.AntiForgeryToken()
                <h4>Use a local account to log in.</h4>
                <hr />
                @Html.ValidationSummary(true)
                <div class="form-group">
                    @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.UserName)
                    </div>
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.Password)
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <div class="checkbox">
                            @Html.CheckBoxFor(m => m.RememberMe)
                            @Html.LabelFor(m => m.RememberMe)
                        </div>
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Log in" class="btn btn-default" />
                    </div>
                </div>

如何让用户在首次登录后更改其密码

我刚刚遇到了类似的问题。我的系统可以选择管理员创建用户。我所做的是使用随机生成的密码创建用户。

确认电子邮件

通常有一个包含电子邮件确认令牌的 URL。我所做的只是包括确认和电子邮件重置令牌:

string emailConfirmationCode = await 
UserManager.GenerateEmailConfirmationTokenAsync(userID);
        string passwordSetCode = await UserManager.GeneratePasswordResetTokenAsync(userID);

var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = userID, emailConfirmationCode = emailConfirmationCode, passwordSetCode = passwordSetCode }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(userID, subject,$"Please confirm your account by clicking <a href='"{callbackUrl}'">here</a>");

然后,在我的确认电子邮件操作中:

[AllowAnonymous]
public async Task<ActionResult> ConfirmEmail(string userId, string emailConfirmationCode, string passwordSetCode = null )
{
    if (userId == null || emailConfirmationCode == null)
    {
        return View("Error");
    }
    var result = await UserManager.ConfirmEmailAsync(userId, emailConfirmationCode);
    if (result.Succeeded && !string.IsNullOrEmpty(passwordSetCode))
    {
        return RedirectToAction("ResetPassword", "Account", new { userId = userId, code = passwordSetCode, firstPassword = true  });
    }
    return View(result.Succeeded ? "ConfirmEmail" : "Error");
}

请注意,我使用 firstPassword,以便我可以显示与忘记密码不同的视图

[AllowAnonymous]
public ActionResult ResetPassword(string code, bool firstPassword = false)
{
    if (code == null)
        return View("Error");
    return firstPassword? View("FirstPassword") : View();
}

这样,他们登录的唯一方法是确认他们的电子邮件并设置他们的密码。如果他们不知何故没有完成重置,他们需要从头开始执行忘记密码的过程。第二次重新单击他们的链接会给我一个令牌错误。

  1. 在数据库ChangePassword [User]表中创建新字段,默认值等于 1。
  2. 当新用户登录时,请检查此用户是否有字段 ChangePassword = 1 .
  3. 如果用户应更改密码,请将他重定向到页面ChangePasswordPage在其他情况下重定向到默认页面。
  4. 当他填写新密码并单击Change Password按钮时,将表中[User]更改密码标志设置为 0,并将他重定向到您的默认页面。

如果你有一个数据库字段跟踪他上次登录,那么实现一个简单的解决方案会很容易,比如:

  1. 首次使用通用密码时,上次登录字段将为空。
  2. 您可以检查
  3. 上次登录的字段是否为空,他们从未更改过密码,因此您可以强制他们更改密码(您可以检查新密码是否与以前不同)并让他们登录。现在用户上次登录日期设置为不为空。他现在设置为使用新密码登录。

强制他们更改密码。只要他们没有更改那里的"一次性"密码,就无法访问该网站。让他们键入 2 他们的新密码,检查他们是否相等,然后更新他们的密码。在某个地方,可能在您的数据库中,您必须跟踪他们是否更改了一次性密码。