我有一个ASP MVC项目,我想在用户被锁定后发送一个解锁帐户锁定链接到用户的电子邮件。我在我的项目中使用asp.net identity 2.1。我能做的就是使用asp身份锁定帐户30分钟。在此之后,该帐户将被解锁。我试图向包含重置链接的用户发送电子邮件。该链接调用一个方法,该方法的代码如下:
[AllowAnonymous]
public async Task<ActionResult> UnlockAccount(string userId)
{
await UserManager.ResetAccessFailedCountAsync(userId);
return RedirectToAction("Login");
}
但在此之后,我的帐户仍然被锁定了30分钟的时间,这是在IdentityConfig.cs中设置的。
我知道这是一个古老的问题,但它值得回答,因为我自己也一直在想同样的问题…
AccessFailedCount
无关紧要——唯一将用户锁定在外的是LockoutEndDateUtc
。如果当前的UTC日期时间在LockoutEndDateUtc
之前,那么您将无法获得条目。
重置很简单:
await UserManager.SetLockoutEndDateAsync(userId, new DateTimeOffset(DateTime.UtcNow));
您可以将DateTimeOffset
设置为任何您想要的东西,只要它在当前DateTimeUTC之前,在我的示例中,我使用DateTime.UtcNow
,因为它提供了知道帐户何时解锁的额外好处。
当用户最终再次登录时,AccessFailedCount
将重置为0,因此您无需担心重置。
我想我应该根据上面的两个评论添加一个答案,因为它们似乎提供了最好的解决方案。我有一个表单,其中我显示一个reCAPTCHA一旦用户被锁定,并清除锁定,如果他们提交正确的密码与有效的reCAPTCHA一起。我使用的重置方法如下:
private async Task ResetLockoutIfPasswordCorrect(string username, string password)
{
var user = await _userManager.FindByNameAsync(username);
if (await _userManager.CheckPasswordAsync(user, password))
{
await _userManager.ResetAccessFailedCountAsync(user);
await _userManager.SetLockoutEndDateAsync(user, null);
}
}
就像我说的,我用reCAPTCHA来保护这个方法