Ich arbeite auf eine Anwendung von Web Forms zu MVC verschieben und entschied mich für MVC 6 mit ASP.NET Core.ASP.NET Core Identity - Erweiterung Password Hasher
In meiner aktuellen Anwendung habe ich ein benutzerdefiniertes Passwort Hasher mit Identity verwendet. Die Umsetzung ist sehr einfach in meiner benutzerdefinierten Usermanager Klasse:
public ApplicationUserManager()
: base(new UserStore<IdentityUser>(new AuthContext()))
{
this.PasswordHasher = new SqlPasswordHasher();
}
Ich versuche, das gleiche mit .NET-Core aber die PasswordHasher Eigenschaft in Usermanager existiert nicht zu tun. Ich sehe, dass der Konstruktor wird ein IPasswordHasher Parameter nehmen, so habe ich versucht, dies:
public ApplicationUserManager(IUserStore<ApplicationUser> store, IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<ApplicationUser> passwordHasher, IEnumerable<IUserValidator<ApplicationUser>> userValidators,
IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators, ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors, IServiceProvider serviceProvider, ILogger<UserManager<ApplicationUser>> logger)
: base(store, optionsAccessor, new SqlPasswordHasher(), userValidators, passwordValidators, keyNormalizer, errors,
serviceProvider, logger)
{
}
In SqlPasswordHasher ich einfach bin das Überschreiben der VerifyHashedPassword Methode, die wie folgt aussieht:
public override PasswordVerificationResult VerifyHashedPassword(ApplicationUser user, string hashedPassword, string providedPassword)
{
// My custom logic is here
...
}
jedoch die oben doesn‘ t arbeiten. Ich habe einen Haltepunkt in der VerifyHashedPassword-Methode von SqlPasswordHasher festgelegt und es wird nicht ausgelöst.
Ich dachte, ich würde dies in die falsche Richtung gehen und ich sollte DI verwenden, um dies zu erreichen. Ich aktualisiert den Konstruktor meines Benutzer-Manager, so dass es kein neues SqlPasswordHasher nicht instanziiert, sondern verwendet die Standard-Schnittstelle Parameter statt:
public ApplicationUserManager(IUserStore<ApplicationUser> store, IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<ApplicationUser> passwordHasher, IEnumerable<IUserValidator<ApplicationUser>> userValidators,
IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators, ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors, IServiceProvider serviceProvider, ILogger<UserManager<ApplicationUser>> logger)
: base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors,
serviceProvider, logger)
{
}
Dann in Startup.cs ich ein scoped Dienst hinzugefügt:
services.AddScoped<IPasswordHasher<ApplicationUser>, SqlPasswordHasher>();
Aber auch dies funktioniert nicht und der Haltepunkt in SqlPasswordHasher wird nie ausgelöst.
Ich habe eine ähnliche Linie für meine benutzerdefinierten Anmelden Manager:
services.AddScoped<SignInManager<ApplicationUser>, ApplicationSignInManager>();
Das funktioniert gut. Der ApplicationSignInManager nimmt einen UserManager-Parameter und ich kann sehen, dass der UserManager einen IPasswordHasher-Parameter verwendet.
Ich nehme an, SignInManager verwendet den UserManager, der den PasswordHasher verwendet. Also meine Frage ist, wie bekomme ich den UserManager meinen benutzerdefinierten Password Hasher zu verwenden? Oder wenn das nicht der Fall ist, wie bekomme ich den SignInManager um mein Passwort hashher zu benutzen?
EDIT: Ich konnte bestätigen, dass, wenn mein ApplicationUserManager instanziiert wird, mein SqlPasswordHasher im Konstruktor verwendet wird, damit das DI ordnungsgemäß funktioniert. Ich kann einfach nicht herausfinden, warum meine Überschreibung von VerifyHashedPassword nicht ausgelöst wird.
welche funktionierte? auf demselben Boot. scheinbar v2.0 ist es im usermanager selbst eingespritzt. Versuchen Sie, dies innerhalb von Cusotm passwordvalidator ohne Erfolg zu verwenden. – Jay
@Jay der Code, den ich gearbeitet habe. Mein Problem war tatsächlich mit den Daten. Ich habe das nicht für 2.0 angeschaut, also bin ich mir nicht sicher, ob mein Code oben dort funktionieren würde. Es tut uns leid. (Entschuldigung, ich habe so spät geantwortet) –
keine Sorgen. Ich habe es herausgefunden. in meinem Fall war es ein dummer Fehler. Vielen Dank für Ihre Nachricht – Jay