web-dev-qa-db-fra.com

Utilisation de C # pour authentifier l'utilisateur contre LDAP

J'utilise DirectorySearcher pour rechercher une entrée d'utilisateur dans le serveur LDAP.

DirectoryEntry de = new DirectoryEntry();
de.Path = "LDAP://myserver/OU=People,O=mycompany";
de.AuthenticationType = AuthenticationTypes.None;

DirectorySearcher deSearch = new DirectorySearcher();

deSearch.SearchRoot = de;
deSearch.Filter = "(uid=" + model.UserName + ")";

SearchResult result = deSearch.FindOne();

Je peux obtenir la sortie prévue dans la variable de résultat.
Cependant, si j'essaie d'authentifier le même utilisateur en fournissant un mot de passe dans l'entrée de répertoire, j'obtiens toujours l'erreur suivante.

"Le pseudo ou mot de passe est incorect."

DirectoryEntry entry = new DirectoryEntry("LDAP://myserver/OU=People,O=mycompany", username, password);
DirectorySearcher search = new DirectorySearcher(
    entry,
    "(uid=" + username + ")",
    new string[] { "uid" }
);

search.SearchScope = System.DirectoryServices.SearchScope.Subtree;
SearchResult found = search.FindOne();   ->>>>>this is where I get wrong credential error.

Le nom d'utilisateur et le mot de passe sont destinés à l'utilisateur que je souhaite authentifier.

Quelqu'un peut-il me dire ce que je fais mal ici ou comment déboguer cela.

21
sunny days

Ce nom d'utilisateur, mot de passe dans cette ligne:

DirectoryEntry("LDAP://myserver/OU=People,O=mycompany", username, password);

devrait être pour un compte autorisé à rechercher un répertoire. Il peut s'agir d'un compte de service ou d'un test à essayer avec le vôtre. Cela ne devrait pas être l'utilisateur/le laissez-passer de quelqu'un que vous essayez d'authentifier.

Si vous souhaitez vous authentifier, vous pouvez utiliser les étapes suivantes à l'aide de PrincipalContext:

using(var context = new PrincipalContext(ContextType.Domain, "mydomain", "mydomain\serviceAcct", "serviceAcctPass")) {
 //Username and password for authentication.
 return context.ValidateCredentials(username, password); 
}

"serviceAcct" = un compte au sein des utilisateurs du domaine qui est autorisé à rechercher des répertoires. "serviceAcctPass" = mot de passe pour ce compte de service. Comme je l'ai dit, pour les tests, vous pouvez essayer avec votre propre contexte utilisateur/passe.

Assurez-vous également que le nom d'utilisateur fourni a le format "domaine\nom d'utilisateur" ou "nom d'utilisateur @ domaine".

41
loopedcode