实现Microsoft AspNet标识IUserLockoutStore

时间:2016-05-04 07:08:54

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

我正在使用Microsoft.AspNet.Identity登录我的c#mvc Web应用程序。我已经实现了不同的用户商店,包括锁定用户商店。但我不能让它正常工作。在我的自定义用户管理器中,我设置了最大尝试次数,锁定时间等:

manager.UserLockoutEnabledByDefault = true;
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(30);
manager.MaxFailedAccessAttemptsBeforeLockout = 5;

如果我使用上面的代码和参数,我的用户永远不会被锁定。如果我将manager.MaxFailedAccessAttemptsBeforeLockout设置为2,我的用户在一次尝试后就会被锁定。有没有人有关于如何正确实现“IUserLockoutStore”界面的教程?我整个上午都在搜索谷歌,而且我的目标并未接近。这是我当前实现的“IUserLockoutStore”接口。

    public Task<DateTimeOffset> GetLockoutEndDateAsync(Gebruiker user)
    {
        var lockOutDate = user.LockOutDate.HasValue ? user.LockOutDate.Value : new DateTimeOffset(DateTime.Now.AddMinutes(-5));
        return Task.FromResult(lockOutDate);
    }
    public Task SetLockoutEndDateAsync(Gebruiker user, DateTimeOffset lockoutEnd)
    {
        user.LockOutDate = lockoutEnd;
        user.IsLocked = true;
        return Context.SaveChangesAsync();
    }

    public Task<int> IncrementAccessFailedCountAsync(Gebruiker user)
    {
        user.LoginTry++;
        return Context.SaveChangesAsync();
    }

    public Task ResetAccessFailedCountAsync(Gebruiker user)
    {
        user.LoginTry = 0;
        return Context.SaveChangesAsync();
    }

    public Task<int> GetAccessFailedCountAsync(Gebruiker user) => Task.FromResult(user.LoginTry);

    public Task<bool> GetLockoutEnabledAsync(Gebruiker user) => Task.FromResult(true);

    public Task SetLockoutEnabledAsync(Gebruiker user, bool enabled)=> Task.FromResult(enabled);

1 个答案:

答案 0 :(得分:3)

我的实现与你的实现非常相似,除了这两件事:

GetLockoutEndDateAsync我使用utc time:

... new DateTimeOffset(DateTime.UtcNow.AddMinutes(-5))

同样(也许更重要),IncrementAccessFailedCountAsync的返回值应返回计数(但您返回SaveChanges的结果):

public Task<int> IncrementAccessFailedCountAsync(Gebruiker user)
{
    user.LoginTry++;
    Context.SaveChangesAsync();
    return user.LoginTry;
}

巧合的是SaveChangesAsync也返回一个int,这可能是你没注意到的原因。

另一个注意事项是,您首先不必致电Context.SaveChangesAsync()。这由您IUserStore的实施处理。您的IUserLockoutStore(以及IUserLoginStoreIUserEmailStore等其他人)不会保存到数据库中。基础架构调用这些接口来设置事物,然后在最后调用IUserStore.UpdateAsync(或.CreateAsync)。所以它应该只是:

public Task<int> IncrementAccessFailedCountAsync(Gebruiker user)
{
    user.LoginTry++;
    return Task.FromResult(user.LoginTry);
}