. net Идентификатор Core 3 «AccessFailedCount» не увеличивается - PullRequest
1 голос
/ 15 февраля 2020

У меня проблема с asp. net Идентификационным проектом Core 3. Я создал пользовательские UserStore и RoleStore для использования Dapper вместо Entity Framework. Кажется, что большинство работает, за исключением неудачной попытки входа в систему, AccessFailedCount в базе данных не увеличивается. Я прошел через код и обнаружил, где логика c не работает. Он находится в методе SignInManager с именем CheckPasswordSignInAsync, в этом блоке:

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 в UserManager:

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

Но я не могу понять, что здесь устанавливает его в false? Откуда это значение?

1 Ответ

2 голосов
/ 15 февраля 2020

Я думаю, у вас есть проблема, вы не реализовали IUserLockoutStore<TUser> интерфейс. Поскольку вы не используете платформу Entity, вам необходимо реализовать все необходимые хранилища самостоятельно. Ниже приведены функции, которые вам нужно реализовать.

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>, вы должны включить функцию блокировки для отдельного пользователя, чтобы добиться этого, вам просто нужно установить User.LockoutEnabled = 1 (true) в AspNetUsers таблице.

Я надеюсь, что это решит вашу проблему!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...