使用asp net identity 2.1

时间:2015-10-23 06:20:57

标签: c# asp.net-mvc-5 asp.net-identity

我有一个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网络身份中是否可行。

2 个答案:

答案 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 来保护这个方法。