通过使用asp.net identity 2.1发送重置帐户链接重置用户锁定



我有一个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来保护这个方法

相关内容

  • 没有找到相关文章

最新更新