2010-02-16 3 views
2

Mon application Django utilise la bibliothèque python-ldap (application django ldap_groups) et doit ajouter des utilisateurs à Active Directory sur un domaine de machine virtuelle Windows 2003. Mon application s'exécutant sur une machine virtuelle Ubuntu n'est pas membre du domaine Windows.ldap déclenche une erreur UNWILLING TO PERFORM

Voici le code:

settings.py

DNS_NAME='IP_ADRESS' 

LDAP_PORT=389 
LDAP_URL='ldap://%s:%s' % (DNS_NAME,LDAP_PORT) 
BIND_USER='cn=administrateur,cn=users,dc=my,dc=domain,dc=fr' 
BIND_PASSWORD="AdminPassword" 

SEARCH_DN='cn=users,dc=my,dc=domain,dc=fr' 
NT4_DOMAIN='E2C' 
SEARCH_FIELDS= ['mail','givenName','sn','sAMAccountName','memberOf'] 
MEMBERSHIP_REQ=['Group_Required','Alternative_Group'] 

AUTHENTICATION_BACKENDS = (

    'ldap_groups.accounts.backends.ActiveDirectoryGroupMembershipSSLBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

DEBUG=True 
DEBUG_FILE='/$HOME/ldap.debug' 

backends.py

import ldap 
import ldap.modlist as modlist 

username, email, password = kwargs['username'], kwargs['email'], kwargs['password1'] 

ldap.set_option(ldap.OPT_REFERRALS, 0) 

# Open a connection 
l = ldap.initialize(settings.LDAP_URL) 

# Bind/authenticate with a user with apropriate rights to add objects 
l.simple_bind_s(settings.BIND_USER,settings.BIND_PASSWORD) 

# The dn of our new entry/object 
dn="cn=%s,%s" % (username,settings.SEARCH_DN) 


# A dict to help build the "body" of the object 
attrs = {} 
attrs['objectclass'] = ['top','organizationalRole','simpleSecurityObject'] 
attrs['cn'] = username.encode('utf-16') 
attrs['userPassword'] = password.encode('utf-16') 
attrs['description'] = 'User object for replication using slurpd' 

# Convert our dict to nice syntax for the add-function using modlist-module 
ldif = modlist.addModlist(attrs) 

# Do the actual synchronous add-operation to the ldapserver 
l.add_s(dn,ldif) 

# Its nice to the server to disconnect and free resources when done 
l.unbind_s() 

Quand je trace mon code, il semble qu'il y ait un problème tout en ajoutant les appels utilisateur " l.add_s ".

Cependant, il renvoie l'erreur de followings:

UNWILLING_TO_PERFORM at /accounts/register/ 

{'info': '00002077: SvcErr: DSID-031907B4, problem 5003 (WILL_NOT_PERFORM), data 0\n', 'desc': 'Server is unwilling to perform'} 

Si je informations d'identification incorrectes le serveur renvoie CREDENTIAL VALIDE, donc je pense que les pouvoirs que je utilise ci-dessus sont corrects pour lier le répertoire ldap.

Peut-être mon Ubuntu devrait-il être membre du domaine ou il y a quelque chose qui ne va pas dans mon code?

Répondre

2

J'ai trouvé le problème. En fait, ma classe d'objet n'était pas compatible avec Active Directory. En outre modifier le codage d'informations par une chaîne python.

Voici le code à utiliser:

attrs = {} 
     attrs['objectclass'] = ['top','person','organizationalPerson','user'] 
     attrs['cn'] = str(username) 
     attrs['userPassword'] = str(password) 
     attrs['mail']=str(email) 
     attrs['givenName']=str(firstname) 
     attrs['sn']=str(surname) 
     attrs['description'] = 'User object for replication using slurpd' 

Je peux ajouter un compte dans mon Active Directory avec succès.

Espérons que cela vous aidera.