Ich arbeite mit Microsoft Asp.Net Identity Framework Version 2 und implementiere meinen eigenen IUserStore. Meine neue Klasse MyUserStore
implementiert die IUserStore<MyUserClass,int>
Schnittstelle und die IUserPasswordStore<MyUserClass,int>
, die benötigt wird, um es mit der UserManager<MyUserClass,int>
Klasse zu verwenden. Oder zumindest das ist, was ich aus der Lektüre Tutorials wie this gesammelt:Wenn Sie Ihren eigenen IUserStore implementieren, sind die "optionalen" Schnittstellen der Klasse tatsächlich optional?
„Die eine erforderliche Schnittstelle in dem Identitätssystem ist IUserStore“ - Scott Allen
Aber das scheint nicht der Fall zu sein wenn ich den Code ausführe.
ich initialisieren meinen Manager:
var uMan= new UserManager<MyUserClass, int>(new MyUserStore());
var sMan = new SignInManager<MyUserClass, int>(uMan,authCtxFromOwin);
Und wenn sMan.PasswordSignIn (...) auf dem SignInManager ausgeführt wird, ganz gleich, was die SignInManager laufen Funktionalität immer im Usermanager, die auf den optionalen Schnittstellen hängen . Hier ist die Quelle für die PasswordSignInAsync Methode aus der SignInManager Klasse:
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;
}
Es ruft immer UserManager.IsLockedOutAsync(), bevor er versucht, das Kennwort zu überprüfen, so dass, wenn der Speicher nicht die Schnittstelle IUserLockoutStore implementieren, eine Ausnahme wird jedes Mal geworfen, egal was passiert.
Bedeutet dies, dass Sie, um die Standardfunktionen der UserManager- und SignInManager-Klassen zu verwenden, jede I * Store-Schnittstelle implementieren müssen?
Die Problemumgehung besteht darin, dass er von SignInManager erbt und die PasswordSignInAsync-Methode überschreibt. Ist das die übliche Praxis?
Danke!
Mit Blick auf die neueste Version der Quelle auf GitHub, dies festgelegt ist worden (https://github.com/aspnet/Identity/blob/c9d27e27e6dd6c15b4228de6e5de3c1a22c15a6d/src/Microsoft.AspNet.Identity/SignInManager.cs#L94). Natürlich hilft das nicht für die aktuellen Releases, aber wir sollten das in Zukunft sehen. –