我有一个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中设置。这在asp网络身份中是否可行。
答案 0 :(得分:18)
我知道这已经过时了,但是因为我自己一直在想这个问题,所以它值得一个答案...
AccessFailedCount
并不重要 - 锁定用户的唯一因素是LockoutEndDateUtc
。如果当前的UTC日期时间早于LockoutEndDateUtc
,那么您将无法获得进入。
虽然很简单但可以重置:
await UserManager.SetLockoutEndDateAsync(userId, new DateTimeOffset(DateTime.UtcNow));
您可以将DateTimeOffset
设置为您想要的任何内容,只要它在当前DateTimeUTC之前,在我的示例中我使用DateTime.UtcNow
,因为它提供了知道帐户何时的额外好处解锁了。
当用户最终再次登录时,AccessFailedCount
将重置为0,因此您无需担心重置该内容。
答案 1 :(得分:1)
我想我会根据上面的两条评论添加一个答案,因为它们结合起来似乎提供了最好的解决方案。我有一个表单,一旦用户被锁定,我就会在其中显示 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 来保护这个方法。