这是使用MVC 4中的SimpleMembershipProvider访问webpages_Membership表信息的最佳方法吗?如果他/她输入错误的密码三次,我试图实施帐户阻止..
非常感谢
答案 0 :(得分:6)
使用SimpleMembership,您可以使用以下方法访问此信息:
WebSecurity.IsAccountLockedOut(userName, allowedPasswordAttempts, intervalInSeconds)
IsAccountLockedOut根据您要允许的尝试次数以及自上次尝试登录失败以来的时间,返回帐户是否被锁定。这用于阻止暴力破解其他机器破解密码的企图。您可以在对用户进行身份验证的位置添加此检查,例如Account controllers Login方法。你可以这样做:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid &&
!WebSecurity.IsAccountLockedOut(model.UserName, 3, 180) &&
WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
在这种情况下,您不希望完全禁用用户,并允许有效用户在间隔过后再次使用。这可以阻止暴力攻击而不是忘记密码的人。
在注册过程中使用 IsConfirmed 字段,您希望用户确认他们为您提供了有效的电子邮件地址。您将在数据库中生成并存储 ConfirmationToken ,您将通过该电子邮件发送给用户,并指示他们单击链接,将其带到MVC应用程序中的控制器/操作,以验证令牌并将 IsConfirmed 字段设置为true。
答案 1 :(得分:1)
davide,要完全禁用用户,您可以创建一个新角色“已禁用”并修改登录代码:
public ActionResult Login(LoginModel model, string returnUrl)
{
string errorMsg = "The user name or password provided is incorrect.";
if (Roles.IsUserInRole(model.UserName, "Disabled"))
{
errorMsg = "Your account has been disabled. Contact webmaster for more info.";
}
else if (ModelState.IsValid &&
!WebSecurity.IsAccountLockedOut(model.UserName, 3, 180) &&
WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
if (!WebSecurity.IsConfirmed(model.UserName))
{
errorMsg = "You have not completed the registration process. "
+ "To complete this process look for the email that provides instructions.";
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", errorMsg);
return View(model);
}