Ao implementar seu próprio IUserStore, as interfaces “opcionais” na classe são realmente opcionais?

Estou trabalhando com o framework Asp.Net Identity da Microsoft, versão 2, e estou implementando meu próprio IUserStore. Minha nova aulaMyUserStore implementa oIUserStore<MyUserClass,int> interface e oIUserPasswordStore<MyUserClass,int>, que é necessário para usá-lo com oUserManager<MyUserClass,int> classe. Ou pelo menos foi o que reuni lendo tutoriais comoesta:

"A única interface necessária no sistema de identidade é IUserStore" - Scott Allen

Mas isso não parece ser o caso quando executo o código.

Eu inicializo meu gerente:

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

E quando o sMan.PasswordSignIn (...) no SignInManager é executado, não importa como, o SignInManager sempre executa funcionalidades no UserManager que dependem das interfaces opcionais. Aqui está a fonte do método PasswordSignInAsync da classe 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;
        }

Ele sempre chama UserManager.IsLockedOutAsync () antes de tentar verificar a senha; portanto, se o armazenamento não implementar a interface IUserLockoutStore, uma exceção será lançada toda vez, não importa o que aconteça.

Isso significa que, para usar a funcionalidade padrão das classes UserManager e SignInManager, você precisa implementar todas as interfaces I * Store?

Parece que a solução alternativa é herdar do SignInManager e substituir o método PasswordSignInAsync. Essa é a prática padrão?

Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion