.net Core 3 标识"访问失败计数"不递增



我在使用 Core 3 asp.net 身份项目时遇到问题。我已经创建了自定义UserStoreRoleStore来使用Dapper而不是Entity Framework。大多数似乎都在工作,除了登录尝试失败时,数据库中的AccessFailedCount没有递增。我已经逐步浏览了代码,并找到了逻辑失败的地方。它位于名为CheckPasswordSignInAsyncSignInManager方法中,在此块中:

if (UserManager.SupportsUserLockout && lockoutOnFailure)
{
// If lockout is requested, increment access failed count which might lock out the user
await UserManager.AccessFailedAsync(user);
if (await UserManager.IsLockedOutAsync(user))
{
return await LockedOut(user);
}
}

UserManager.SupportsUserLockout的值是false,因此它永远不会命中AccessFailedAsync方法。但我不确定这个值从何而来。UserManagerUserManager.SupportsUserLockout的代码块为:

public virtual bool SupportsUserLockout
{
get
{
this.ThrowIfDisposed();
return this.Store is IUserLockoutStore<TUser>;
}
}

但是我不知道这里是什么将其设置为假?这个价值从何而来?

我想我遇到了你的问题,你还没有实现IUserLockoutStore<TUser>接口。由于您没有使用实体框架,因此您需要自己实现所有必要的存储。以下是您需要实现的功能。

Task<int> GetAccessFailedCountAsync(TUser user, CancellationToken cancellationToken);
Task<bool> GetLockoutEnabledAsync(TUser user, CancellationToken cancellationToken);
Task<DateTimeOffset?> GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken);
Task<int> IncrementAccessFailedCountAsync(TUser user, CancellationToken cancellationToken);
Task ResetAccessFailedCountAsync(TUser user, CancellationToken cancellationToken);
Task SetLockoutEnabledAsync(TUser user, bool enabled, CancellationToken cancellationToken);
Task SetLockoutEndDateAsync(TUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken);

实现IUserLockoutStore<TUser>界面后,您必须为单个用户启用锁定功能,为了实现这一点,您只需要在AspNetUsers表中设置User.LockoutEnabled = 1 (true)

我希望这能解决您的问题!

最新更新