I Identity Server 4 und implementiert die folgenden zwei Schnittstellen ist mit:Validieren Gegen Anmeldeinformationen Benutzerdefinierte Benutzer DB - IResourceOwnerPasswordValidator
IResourceOwnerPasswordValidator: für den Zweck Benutzer-Credentials gegen meine Gewohnheit DB der Validierung
public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
{
private IUserRepository _userRepository;
public ResourceOwnerPasswordValidator(IUserRepository userRepository)
{
this._userRepository = userRepository;
}
public Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
{
var isAuthenticated = _userRepository.ValidatePassword(context.UserName, context.Password);
//code is omitted for simplicity
}
}
IProfileService: um notwendige Ansprüche zu erhalten
public class ProfileService : IdentityServer4.Services.IProfileService
{
public IUserRepository _userRepository;
public ProfileService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
//code is ommitted
}
Dann dann notwendige Schnittstellen und Abhängigkeiten zu den Diensten in der Startup-Klasse hinzugefügt. Ich habe modifiziert auch die Konto-Controller durch den Login-Dienst Injektion, die die folgende Implementierung hat:
public class LoginService
{
private readonly IUserRepository _userRepository;
public LoginService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public bool ValidateCredentials(string username, string password)
{
return _userRepository.ValidatePassword(username, password);
}
Der Account „Login“ Aktion für die Anmeldeinformationen validieren durch den Aufruf:
if (_loginService.ValidateCredentials(model.Username, model.Password))
{
var user = _loginService.FindByUsername(model.Username);
await HttpContext.Authentication.SignInAsync(user.Subject, user.Username);
//other code is omitted
Wenn das Projekt Debuggen des Login-Aktion von AccountContoller wird aufgerufen, dann mein Login-Service. Nach der Überprüfung der Benutzeranmeldeinformationen wird die Einverständniserklärung angezeigt, die die ProfileService GetProfileDataAsync-Methode auslöst.
Der ResourceOwnerPasswordValidator wurde jedoch nie aufgerufen. Werde ich den LoginService in der richtigen Weise implementieren oder sollte ich das von IResourceOwnerPasswordValidation injizierte IUserRepository ersetzen und dann die "ValidateAsync" -Methode im Anmeldedienst ValidateCrefentails?
Und wenn das der Fall war, was ist der Vorteil der Übergabe an LoginService, da ich bereits Benutzer auf diese Weise validiere?