Comment puis-je valider les droits d'accès Active Directory via LDAP + SSL?
Je suis en train d'utiliser l' .NET 3.5 System.DirectoryServices.AccountManagement
espace de noms pour valider les informations d'identification d'utilisateur à l'encontre de notre Active Directory serveur LDAP sur un cryptage SSL connexion LDAP. Voici un exemple de code:
using (var pc = new PrincipalContext(ContextType.Domain, "sd.example.com:389", "DC=sd,DC=example,DC=com", ContextOptions.Negotiate))
{
return pc.ValidateCredentials(_username, _password);
}
Ce code fonctionne très bien sur non garantis LDAP (port 389), mais je préfère ne pas transmettre un user/pass combinaison en texte clair. Mais lorsque je change de LDAP + SSL (port 636), j'obtiens l'exception suivante:
System.DirectoryServices.Protocols.DirectoryOperationException: The server cannot handle directory requests.
at System.DirectoryServices.Protocols.ErrorChecking.CheckAndSetLdapError(Int32 error)
at System.DirectoryServices.Protocols.LdapSessionOptions.FastConcurrentBind()
at System.DirectoryServices.AccountManagement.CredentialValidator.BindLdap(NetworkCredential creds, ContextOptions contextOptions)
at System.DirectoryServices.AccountManagement.CredentialValidator.Validate(String userName, String password)
at System.DirectoryServices.AccountManagement.PrincipalContext.ValidateCredentials(String userName, String password)
at (my code)
Port 636 fonctionne pour d'autres activités, telles que la recherche de la non-information de mot de passe pour que LDAP/AD entrée...
UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, _username)
...donc je sais que ce n'est pas mon LDAP SSL du serveur de configuration, car il fonctionne sur SSL pour d'autres recherches.
Quelqu'un a eu le ValidateCredentials(...)
appel à travailler sur SSL? Pouvez-vous m'expliquer comment? Ou est-il un meilleur moyen de valider en toute sécurité AD/LDAP informations d'identification?
source d'informationauteur Nate Sauber
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure de valider les informations d'identification à l'aide de la
System.DirectoryServices.Protocols
espace de noms, grâce à un co-travailleur. Voici le code:Je ne suis pas heureux avec l'aide d'un bloc try/catch pour le contrôle de prise de décision logique, mais c'est ce qui fonctionne. :/
C'est peut-être une autre façon. Il n'y a rien d'inhabituel à valider les informations d'identification. Le ContextOptions devez définir correctement.
Valeur par défaut:
Ajouter Le Protocole Ssl:
ContextOptions.Négocier ou ContextOptions.SimpleBind est nécessaire. Ou quel que soit votre serveur ont besoin pour effectuer l'authentification. ContextOptions prend uniquement en charge OU bit à bit.
Vous pouvez également essayer de définir la ContextOptions directement de cette façon dans ValidateCredentials méthode.
Ou
Pour moi, le ValidateCredentials méthode fonctionne très bien. Le problème, j'ai trouvé, était sur le serveur d'hébergement de l'ANNONCE (je suis en utilisant AD LDS). Vous avez besoin d'associer le certificat du serveur avec l'ANNONCE de l'instance. Donc, si votre instance qui a été appelé "MyAD" (ou ActiveDirectoryWebService), vous avez besoin d'ouvrir la console MMC snap dans les Certificats de module, sélectionnez "Compte de Service" et sélectionnez "MyAD' de la liste. De là, vous pouvez ajouter le certificat SSL dans le " MyAD Personnels de magasin. Cela a finalement pris le traitement SSL en vitesse.
Je soupçonne, d'après ce que je sais de la LdapConnection méthode et le fait que vous avez omis, la fonction de rappel, que vous n'êtes pas de la validation de votre certificat de serveur. C'est un travail salissant et ValidateCredentials - t-il pour gratuit. Probablement pas une grosse affaire, mais un trou de sécurité aucun-le-moins.
Je sais que c'est vieux, mais pour quelqu'un courir dans ce nouveau:
PrincipalContext.ValidateCredentials(...)
par défaut, essaie d'ouvrir une connexion SSL (ldap_init(NULL, 636)
), suivie par la définition de l'optionLDAP_OPT_FAST_CONCURRENT_BIND
.Si un (de confiance?) certificat du client est présent, cependant, la connexion LDAP est implicitement lié et rapide lier ne peut pas être activé plus. PrincipalContext ne pas tenir compte de cette affaire et ne parvient pas inattendu
DirectoryOperationException
.Solution de contournement: Pour prendre en charge SSL, si possible, mais avoir une de secours, appel
ValidateCredentials(...)
avec les options par défaut en premier (c'est à dire pas d'options). Si cela ne fonctionne pas avec leDirectoryOperationException
essayez de nouveau en spécifiant leContextOptions
(Négocier | Sceau | Signature), qui est ceValidateCredentials
en interne, ne pour leLdapException
de toute façon.