При реализации собственного IUserStore действительно ли «необязательные» интерфейсы в классе являются необязательными?

Я работаю с платформой Microsoft Asp.Net Identity версии 2 и внедряю свой собственный IUserStore. Мой новый классMyUserStore реализуетIUserStore<MyUserClass,int> интерфейс иIUserPasswordStore<MyUserClass,int>, что требуется для его использования сUserManager<MyUserClass,int> учебный класс. Или, по крайней мере, это то, что я собрал, читая учебники, какэтот:

«Единственный необходимый интерфейс в системе идентификации - IUserStore», - Скотт Аллен

Но, похоже, это не тот случай, когда я запускаю код.

Я инициализирую моего менеджера:

var uMan= new UserManager<MyUserClass, int>(new MyUserStore()); 
var sMan = new SignInManager<MyUserClass, int>(uMan,authCtxFromOwin);

И когда sMan.PasswordSignIn (...) на SignInManager выполняется, независимо от того, что SignInManager всегда запускает функциональность в UserManager, которая зависит от дополнительных интерфейсов. Вот источник для метода PasswordSignInAsync из класса SignInManager:

public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
        {
           ...
            if (await UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture())
            {
                return SignInStatus.LockedOut;
            }
            if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture())
            {
                return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture();
            }
            ...
            return SignInStatus.Failure;
        }

Он всегда вызывает UserManager.IsLockedOutAsync (), прежде чем попытаться проверить пароль, поэтому, если хранилище не реализует интерфейс IUserLockoutStore, исключение выдается каждый раз, несмотря ни на что.

Означает ли это, что для использования функциональности по умолчанию классов UserManager и SignInManager необходимо реализовать каждый интерфейс I * Store?

Похоже, что обходной путь должен наследовать от SignInManager и переопределить метод PasswordSignInAsync. Это стандартная практика?

Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос