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!