1

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?

Antwort

3

Nach docs:

Wenn Sie die OAuth 2.0 Ressourceneigentümer Passwort Credential Zuschuss (aka Passwort) verwenden möchten, müssen Sie die IResourceOwnerPasswordValidator Schnittstelle implementieren und registrieren:

Da Sie keine Kennwortvergabe verwenden, ist das erwartete Verhalten, dass Sie ResourceOwnerPasswordValidator nicht aufrufen. Für Ihren Fall benötigen Sie keine ResourceOwnerPasswordValidator Implementierung.

1

Ich lief auf das gleiche Problem. Die Lösung war genau so, wie Sie es getan haben, aber dann musste Startup.cs geändert werden, um es zu sehen.

// Fügt IdentityServer services.AddIdentityServer() .AddResourceOwnerValidator < PasswordAuthentication>()

HINWEIS: Stellen Sie sicher, dass Sie fügen Sie es nicht auf die "AddIdentity", die auch die gleiche .AddResourceOwnerValidator hat Funktion. Ich habe eine Weile gebraucht. Hoffe, das hilft jemandem.

Verwandte Themen