web-dev-qa-db-fra.com

Connexion au LDAP de C # à l'aide de DirectoryServices

J'essaie de vous connecter à un serveur EDirectory 8.8 exécutant LDAP. Comment allais-je faire ça dans .net? Puis-je toujours utiliser les classes dans System.DirectoryService tels que DirectoryENTryRY et DirectorySearcher ou sont-ils spécifiques à la publicité? Dois-je spécifier la "chaîne de connexion" différemment?

J'essaie quelque chose comme le code ci-dessous mais cela ne semble pas fonctionner ...

DirectoryEntry de = new DirectoryEntry ("LDAP://novellBox.sample.com","admin","password",AuthenticationTypes.None);
DirectorySearcher ds = new DirectorySearcher(de);
var test = ds.FindAll();

Des idées?

13
Chaitanya

Eh bien, je pense que votre chaîne de connexion manque un bit - spécifiant uniquement le nom du serveur n'est pas suffisamment bon - vous devez également spécifier un "point de départ" pour votre recherche.

En public, cela serait généralement quelque chose comme le conteneur "Utilisateurs" de votre domaine, que vous spécifieriez comme ceci dans LDAP Parlance:

LDAP://novellBox.sample.com/cn=Users,dc=YourCompany,dc=com

Je ne sais pas comment la LDAP conforme aux nouvelles versions de eDirectory sont - mais cela devrait fonctionner depuis en théorie, c'est standard LDAP indépendamment de la mise en œuvre :-)

Mais encore une fois: seulement en théorie, il n'y a pas de différence entre théorie et pratique .....

Il y a aussi un System.DirectoryServices.Protocols Espace de noms qui offre directement des appels LDAP de bas niveau - et cela n'est définitivement pas lié à la publicité du tout, mais c'est vraiment assez bas .....

Il y a aussi une Novell C # LDAP LDAP mais je n'ai jamais essayé et je ne peux pas dire à quel point c'est complet ou capable. Cela pourrait vous donner quelques indices, cependant!

Voir aussi cet autre Stackoverflow Question À propos de Novell, LDAP et C # - Cela pourrait vous donner des informations supplémentaires.

13
marc_s

J'ai eu du mal à comprendre cela mais vous pouvez utiliser quelque chose comme ce qui suit, cela a fonctionné doux pour moi:

Domain domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, "novellBox.sample.com");
DirectorySearcher ds = new DirectorySearcher(domain.GetDirectoryEntry(), searchQuery);
using (SearchResultCollection src = ds.FindAll())
{....}
5
Fermin

Je pense que vous devez utiliser la syntaxe LDAP pour l'hôte.

Assurez-vous d'oublier de libérer la connexion avec using - Si vous ne disposez pas des entrées de répertoire, ils sont suspendus pour toujours jusqu'à ce que la piscine s'épuise et que votre application se casse.

using (DirectoryEntry de = new DirectoryEntry ("LDAP://CN=server,DC=domain,DC=com","admin","password",AuthenticationTypes.Secure))
{
    ...
}
4
wefwfwefwe

En fonction de la configuration du serveur Directory Directory, vous devrez peut-être utiliser l'espace de noms System.DirectoryServices.Protocols. J'ai écrit un post sur la connexion à OpenLDAP avec elle.

http://mikemstech.blogspot.com/2013/03/searching-non-microsoft-ldap.html

2
Mike Burr

Si le LDAP externe nécessite une authentification avec DN Essayez ceci: d'abord récupérer le DN de l'utilisateur, puis essayez l'authentification avec DN et les informations d'identification de l'utilisateur. Je l'ai testé sur Domino LDAP.

// Autheticate in external LDAP
string ldapserver = "10.1.1.1:389";
string ldapbasedn = "o=mycompany";
string ldapuser = "cn=Administrator,o=mycompany";
string ldappassword = "adminpassword";
string ldapfilter = "(&(objectclass=person)(cn={0}))";

string user = "usertest";
string password = "userpassword";
try
{
    string DN = "";
    using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, ldapuser, ldappassword, AuthenticationTypes.None))
    {
        DirectorySearcher ds = new DirectorySearcher(entry);
        ds.SearchScope = SearchScope.Subtree;
        ds.Filter = string.Format(ldapfilter, user);
        SearchResult result = ds.FindOne();
        if (result != null )
        {
            DN = result.Path.Replace("LDAP://" + ldapserver + "/" , "");
        }
    }
    // try logon   
    using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, DN, password, AuthenticationTypes.None))
    {
        DirectorySearcher ds = new DirectorySearcher(entry);
        ds.SearchScope = SearchScope.Subtree;
        SearchResult result = ds.FindOne();
    }
} catch (Exception) { }
1
Renzo Ciot

J'essaie de vous connecter à un serveur EDirectory 8.8 exécutant LDAP. Comment allais-je faire ça dans .net? Puis-je toujours utiliser les classes dans System.DirectoryService tels que DirectoryENTryRY et DirectorySearcher ou sont-ils spécifiques à la publicité?

Nous utilisons System.DirectoryServices pour Microsoft Active Directory, OpenLDAP exécutant sous Linux et eDirectory sans problème. La réponse est donc oui, vous pouvez utiliser ces classes pour accéder à EDIR.

Dois-je spécifier la "chaîne de connexion" différemment?

Oui, vous l'êtes. Lors du passage au répertoire, une chaîne commençant par "LDAP: //", vous devez vous conformer à la syntaxe LDAP qui est très différente de la syntaxe URI.

Je vous recommande d'utiliser un navigateur LDAP (Google it, il existe de nombreux téléchargements gratuits) afin d'obtenir le chemin correct sur l'objet racine, sinon vous passerez du temps à essayer de déterminer les types d'objets corrects.

1
Joshua