Comment obtenir un DirectoryEntry à partir de LDAP sur SSL?
Je vais essayer d'obtenir à la racine DirectoryEntry à partir de LDAP afin que je puisse afficher un joli graphique de l'arborescence.
Tout fonctionne à merveille sous les connexions normales, mais je ne peux pas le faire fonctionner avec le protocole SSL.
var root = this.checkBoxSSL.Checked
? new DirectoryEntry("LDAP://" + this.textBoxServer.Text,
this.textBoxUsername.Text,
this.textBoxPassword.Text,
AuthenticationTypes.SecureSocketsLayer)
: new DirectoryEntry("LDAP://" + this.textBoxServer.Text,
this.textBoxUsername.Text,
this.textBoxPassword.Text);
var dn = root.Properties["distinguishedName"].Value;
Et ainsi de suite...
Mais j'obtiens un "Serveur non opérationnelles" l'exception". Tout semble aller vers le bas pour que le processus d'affectation. Basé sur des recherches sur l'internet, il pourrait être un problème avec le certificat et/ou la méthode d'Authentification (l'authentification NTLM, etc).
Alors, comment puis-je obtenir un travail DirectoryEntry sur SSL?
Je suis ouvert à des solutions alternatives, tant que je peux récupérer toutes les LDAP Propriétés des nœuds dont j'ai besoin. (Racine, DC, OU, CN, des Groupes et des Utilisateurs)
EDIT: Comme il semble que le problème vient du certificat SSL. Nous n'avons qu'une auto-signé cert atm. Et cela semble être rejeté par .NET par défaut. Nous allons essayer correctement signé cert plus tard, mais il est probable que j'ai besoin d'être en mesure de gérer autosignés.
C'est là que mes connaissances sur les certificats a des limites. Je suis actuellement en train d'explorer une autre solution de code, car il semble être le seul qui me permet d'influencer la totalité de gestion des certificats:
System.Security.Cryptography.X509Certificates.X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2();
cert.Import("..\\..\\test certificate.cer");
LdapConnection con = new LdapConnection("ip:636");
con.Credential = new NetworkCredential("un", "pw");
con.AuthType = AuthType.Ntlm;
con.SessionOptions.SecureSocketLayer = true;
con.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback((ldapcon, cer) => {
var cer2 = new System.Security.Cryptography.X509Certificates.X509Certificate2(cer);
StringBuilder strb = new StringBuilder();
strb.AppendFormat("{0} {1} matches: {2}\n", "Subject", cert.Subject, cert.Subject.Equals(cer2.Subject));
strb.AppendFormat("{0} {1} matches: {2}\n", "Cert Hash", cert.GetCertHashString(), Enumerable.SequenceEqual<byte>(cer.GetCertHash(), cert.GetCertHash()));
strb.AppendFormat("{0} matches: {2}\n", "Public Key", cert.GetPublicKeyString(), Enumerable.SequenceEqual<byte>(cer.GetPublicKey(), cert.GetPublicKey()));
strb.AppendFormat("{0}: {1}, {2}", "Verification", cert.Verify(), cer2.Verify());
var res = MessageBox.Show(strb.ToString(),
"Allow certificate?", MessageBoxButtons.YesNo);
return res == System.Windows.Forms.DialogResult.Yes;
});
con.Bind();
Essentiellement, si ce VerifyServerCertificateCallback renvoie true, alors la connexion réussit, si elle renvoie chutes d'échec de la connexion avec la même exception, comme avec toute autre solution que j'ai essayé.
Curieusement, ni l'installation de l'ANNONCE de certificat ou le certificat racine de l'ANNONCE contrôleur n'a pas aider les autres solutions, mais il ne change pas le résultat de la vérification() la méthode.
Ce genre de vérifications dois-je effectuer sur le certificat dans le rappel de maintenir le caractère sacré de la connexion SSL?
Oui j'ai plus ou moins fait. Mais depuis que je ne travaille pas plus là je vais avoir à répondre de mémoire. En substance, il s'est avéré que j'ai eu à utiliser deux différentes Bibliothèques LDAP selon si j'ai besoin de SSL ou non. Je ne pouvais pas obtenir LdapConnection de travailler avec SSL et les plus récents .net-library refusé de travailler en non-SSL.
Ok, et la "nouvelle" .net lib, c'est que le
LDAPConnection
vous avez ici à votre dernier exemple?La droite. LDAPConnection est le nouveau et DirectoryEntry était l'ancien.
OriginalL'auteur Kempeth | 2015-02-19
Vous devez vous connecter pour publier un commentaire.
Je vous suggérons d'utiliser
PrincipalContext
deSystem.DirectoryServices.AccountManagement
. L'initialisation devrait ressembler à ceci:Après cela, vous pouvez rechercher un
UserPrincipal
et sesDistinguishedName
:Si vous voulez itterate par l'AD-arbre juste faire quelque chose comme ceci avec l'aide de la
PrincipalSearcher
:bien sûr, une fois que vous avez un
PrincipalContext
c'est correctement authentifié via le protocole SSL, vous pouvez faire quelque chose avec elle - rechercher des utilisateurs, créer des utilisateurs, etc.J'ai mis à jour ma réponse avec un petit exemple de comment.
Je ne pense pas qu'il y a tout avantage à l'utilisation de la
PrincipalContext
/PrincipalSearcher
juste pour récupérerDirectoryEntry
objets comme le montre l'exemple...Merci. Mais je suis un PrincipalServerDownException quand j'ai essayer de le faire.
OriginalL'auteur Claudio P
Je crois que tout ce que vous devez faire est de tordre de cet extrait de cibler le bon port (généralement 636):
OriginalL'auteur Brian Desmond
Au premier abord, assurez-vous de compte et le mot de passe est disponible. utilisation ldp.exe outil pour vérifier le compte est disponible.
alors peut-être vous pouvez essayer comme ci-dessous, veuillez utiliser LDAP://pas LDAPS://
OU:
OriginalL'auteur JackWang