如何让用户在首次登录后更改密码?
How to have users change their passwords after the first login?
我创建的网站需要管理员帐户为用户创建帐户。我将如何让这些用户在第一次登录后更改密码?问题是用户将有一个指定给他们的通用密码,在他们决定第一次登录后,我希望他们必须将密码更改为不太通用的密码。
这是我的登录控制器
[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>
强制他们更改密码。只要他们没有更改 "once-off" 密码,就无法访问该站点。让他们输入 2 他们的新密码,检查他们是否相等,然后更新他们的密码。
在某个地方,可能在您的数据库中,您必须跟踪他们是否更改了一次性密码。
如果您有一个数据库字段来跟踪他的最后一次登录,那么很容易实现这样一个简单的解决方案:
- 他们第一次使用通用密码时,上次登录字段将为空。
- 你可以检查最后登录字段是否为空,他们从未更改过密码,所以你可以强制他们更改它(你可以检查新密码是否与以前不同)并让他们登录以及。现在用户上次登录日期设置为不为空。他现在设置为使用新密码登录。
- 在数据库
ChangePassword
中创建新字段[User]
Table,默认值
等于 1.
- 当新用户登录时检查该用户是否有字段
ChangePassword = 1
.
- 如果用户需要更改密码,将他重定向到页面
ChangePasswordPage
,否则重定向到您的默认页面。
- 当他填写新密码并点击
Change Password
按钮时,将 [User]
table 中的 ChangePassword 标志设置为 0 并将他重定向到您的默认页面。
我刚刚遇到了类似的问题。我的系统有管理员创建用户的选项。我所做的是使用随机生成的密码创建用户。
确认电子邮件通常有一个 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>");
然后,在我的 confirmEmail 操作中:
[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();
}
这样,他们登录的唯一方法就是确认电子邮件并设置密码。如果他们以某种方式不执行重置操作,则他们需要从头开始执行忘记密码的过程。重新单击他们的 link 第二次给我一个标记错误。
我创建的网站需要管理员帐户为用户创建帐户。我将如何让这些用户在第一次登录后更改密码?问题是用户将有一个指定给他们的通用密码,在他们决定第一次登录后,我希望他们必须将密码更改为不太通用的密码。
这是我的登录控制器
[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>
强制他们更改密码。只要他们没有更改 "once-off" 密码,就无法访问该站点。让他们输入 2 他们的新密码,检查他们是否相等,然后更新他们的密码。 在某个地方,可能在您的数据库中,您必须跟踪他们是否更改了一次性密码。
如果您有一个数据库字段来跟踪他的最后一次登录,那么很容易实现这样一个简单的解决方案:
- 他们第一次使用通用密码时,上次登录字段将为空。
- 你可以检查最后登录字段是否为空,他们从未更改过密码,所以你可以强制他们更改它(你可以检查新密码是否与以前不同)并让他们登录以及。现在用户上次登录日期设置为不为空。他现在设置为使用新密码登录。
- 在数据库
ChangePassword
中创建新字段[User]
Table,默认值 等于 1. - 当新用户登录时检查该用户是否有字段
ChangePassword = 1
. - 如果用户需要更改密码,将他重定向到页面
ChangePasswordPage
,否则重定向到您的默认页面。 - 当他填写新密码并点击
Change Password
按钮时,将[User]
table 中的 ChangePassword 标志设置为 0 并将他重定向到您的默认页面。
我刚刚遇到了类似的问题。我的系统有管理员创建用户的选项。我所做的是使用随机生成的密码创建用户。
确认电子邮件通常有一个 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>");
然后,在我的 confirmEmail 操作中:
[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();
}
这样,他们登录的唯一方法就是确认电子邮件并设置密码。如果他们以某种方式不执行重置操作,则他们需要从头开始执行忘记密码的过程。重新单击他们的 link 第二次给我一个标记错误。