我正在使用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);
答案 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
(以及IUserLoginStore
和IUserEmailStore
等其他人)不会保存到数据库中。基础架构调用这些接口来设置事物,然后在最后调用IUserStore.UpdateAsync
(或.CreateAsync
)。所以它应该只是:
public Task<int> IncrementAccessFailedCountAsync(Gebruiker user)
{
user.LoginTry++;
return Task.FromResult(user.LoginTry);
}