.net Core 3 身份 'AccessFailedCount' 不递增
.net Core 3 identity 'AccessFailedCount' not incrementing
我在使用 asp.net Core 3 身份项目时遇到问题。我创建了自定义 UserStore
和 RoleStore
以使用 Dapper
而不是 Entity Framework
。大多数似乎都在工作,除了登录尝试失败时,数据库中的 AccessFailedCount
没有增加。我已经逐步检查了代码,并找到了逻辑失败的地方。它位于名为 CheckPasswordSignInAsync
的 SignInManager
方法中,在此块中:
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
方法。但我不确定这个值从何而来。来自 UserManager.SupportsUserLockout
in UserManager
的代码块是:
public virtual bool SupportsUserLockout
{
get
{
this.ThrowIfDisposed();
return this.Store is IUserLockoutStore<TUser>;
}
}
但我不知道这里是什么将它设置为 false?这个值从哪里来?
我想我明白了你的问题,你还没有实现 IUserLockoutStore<TUser>
接口。因为你没有使用 Entity framework 所以你需要自己实现所有必要的存储。以下是您需要实现的功能。
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
[=22= 中设置 User.LockoutEnabled = 1 (true)
].
希望这能解决您的问题!
我在使用 asp.net Core 3 身份项目时遇到问题。我创建了自定义 UserStore
和 RoleStore
以使用 Dapper
而不是 Entity Framework
。大多数似乎都在工作,除了登录尝试失败时,数据库中的 AccessFailedCount
没有增加。我已经逐步检查了代码,并找到了逻辑失败的地方。它位于名为 CheckPasswordSignInAsync
的 SignInManager
方法中,在此块中:
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
方法。但我不确定这个值从何而来。来自 UserManager.SupportsUserLockout
in UserManager
的代码块是:
public virtual bool SupportsUserLockout
{
get
{
this.ThrowIfDisposed();
return this.Store is IUserLockoutStore<TUser>;
}
}
但我不知道这里是什么将它设置为 false?这个值从哪里来?
我想我明白了你的问题,你还没有实现 IUserLockoutStore<TUser>
接口。因为你没有使用 Entity framework 所以你需要自己实现所有必要的存储。以下是您需要实现的功能。
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
[=22= 中设置 User.LockoutEnabled = 1 (true)
].
希望这能解决您的问题!