Comment m'authentifier contre AD en utilisant Python + LDAP. J'utilise actuellement la bibliothèque python-ldap et tout ce qu'elle produit, ce sont des larmes.
Je ne peux même pas me lier pour effectuer une requête simple:
import sys
import ldap
Server = "ldap://my-ldap-server"
DN, Secret, un = sys.argv[1:4]
Base = "dc=mydomain,dc=co,dc=uk"
Scope = ldap.SCOPE_SUBTREE
Filter = "(&(objectClass=user)(sAMAccountName="+un+"))"
Attrs = ["displayName"]
l = ldap.initialize(Server)
l.protocol_version = 3
print l.simple_bind_s(DN, Secret)
r = l.search(Base, Scope, Filter, Attrs)
Type,user = l.result(r,60)
Name,Attrs = user[0]
if hasattr(Attrs, 'has_key') and Attrs.has_key('displayName'):
displayName = Attrs['displayName'][0]
print displayName
sys.exit()
L'exécution de ceci avec [email protected] password username
me donne l'une des deux erreurs suivantes:
Invalid Credentials
- Lorsque je saisis mal ou que j'utilise intentionnellement de mauvaises informations d'identification, l'authentification échoue.
ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, commentaire: Erreur AcceptSecurityContext, données 52e, vece', 'desc': 'Informations d'identification non valides'}
Ou
ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, commentaire: Pour effectuer cette opération, une liaison réussie doit être effectuée sur la connexion., data 0, vece', 'desc': 'Erreur d'opérations '}
Qu'est-ce que je manque pour lier correctement?
J'obtiens les mêmes erreurs sur fedora et windows.
Réponses:
Je manquais
À partir de l'init.
la source
Si vous êtes prêt à utiliser pywin32, vous pouvez utiliser des appels Win32 à partir de Python. Voici ce que nous faisons sur notre serveur Web CherryPy:
la source
Cela a fonctionné pour moi, l.set_option (ldap.OPT_REFERRALS, 0) était la clé pour accéder à ActiveDirectory. De plus, je pense que vous devriez ajouter un "con.unbind ()" afin de fermer la connexion avant de terminer le script.
la source
LDAPObject
sont renvoyées parinitialize()
. La connexion est automatiquement dissociée et fermée lorsque l'objet LDAP est supprimé.Voici un code simple qui fonctionne pour moi.
Ceci est basé sur une réponse précédente .
la source
AttributeError: module 'ldap' has no attribute 'open'
si Kerberos est installé et parle à AD, comme ce serait le cas avec, par exemple, Centrify Express installé et en cours d'exécution, vous pouvez simplement utiliser python-kerberos. Par exemple
retournerait True un utilisateur «joe» a le mot de passe «pizza» dans le royaume Kerberos X.PIZZA.COM. (typiquement, je pense, ce dernier serait le même que le nom du domaine AD)
la source
Je vois votre commentaire à @Johan Buret sur le fait que le DN ne résout pas votre problème, mais je pense aussi que c'est ce que vous devriez examiner.
Compte tenu de votre exemple, le DN du compte administrateur par défaut dans AD sera: cn = Administrator, cn = Users, dc = mydomain, dc = co, dc = uk - veuillez essayer cela.
la source
Basé sur l'excellent tutoriel ldap3 :
J'ai fait ce qui précède en Python3 mais il est censé être compatible avec Python 2.
la source
J'ai essayé d'ajouter
mais au lieu d'une erreur, Python se bloque et ne répond plus à rien. Peut-être que je construis mal la requête de recherche, quelle est la partie de base de la recherche? J'utilise la même chose que le DN pour la liaison simple (oh, et je devais faire
l.simple_bind
, au lieu del.simple_bind_s
):J'utilise AD LDS et l'instance est enregistrée pour le compte actuel.
la source
J'ai eu le même problème, mais il s'agissait de l'encodage du mot de passe
Résolu le problème.
la source
Utilisez un nom distinctif pour vous connecter à votre système.
"CN=Your user,CN=Users,DC=b2t,DC=local"
Il devrait fonctionner sur n'importe quel système LDAP, y compris ADla source
Pour moi, passer de
simple_bind_s()
à abind()
fait l'affaire.la source