Аутентификация через AD/LDAP
Я мало что знаю об AD и LDAP, но пытаюсь реализовать самую тривиальную функцию входа в LDAP/AD в Python. Удачи, хотя я тестировал несколько разных модулей. Наиболее перспективным может быть ldap3:
>>> import ldap3
>>> server = ldap3.Server('myserver')
>>> connection = ldap3.Connection(server)
>>> connection.bind()
True
>>> connection.search(search_base='DC=mydomain,DC=com', search_filter='(&(objectClass=person)(userPrincipalName=firstname.lastname@mydomain.com))', search_scope='LEVEL', attributes=ldap3.ALL_ATTRIBUTES)
True
>>> connection.response[0]
{'uri': ['ldap://ForestDnsZones.mydomain.com/DC=ForestDnsZones,DC=mydomain,DC=com??base'], 'type': 'searchResRef'}
>>> connection.result
{'result': 0, 'description': 'success', 'dn': '', 'message': '', 'referrals': None, 'type': 'searchResDone'}
Не могли бы вы дать мне несколько советов, если это на правильном пути или нет?
Настройка кажется достаточно хорошей для основ, так как я могу извлечь из нее метаданные определенного типа:
>>> server._get_dsa_info(connection)
>>> server._dsa_info
DSA info (from DSE):
Supported LDAP versions: 3, 2
Naming contexts:
DC=mydomain,DC=com
CN=Configuration,DC=mydomain,DC=com
CN=Schema,CN=Configuration,DC=mydomain,DC=com
DC=DomainDnsZones,DC=mydomain,DC=com
DC=ForestDnsZones,DC=mydomain,DC=com
Supported controls:
1.2.840.113556.1.4.1338 - Verify name - Control - MICROSOFT
1.2.840.113556.1.4.1339 - Domain scope - Control - MICROSOFT
1.2.840.113556.1.4.1340 - Search options - Control - MICROSOFT
...
Я также пробовал flash-ldap3-login, но начинает подозревать, что наша AD не настроена в соответствии со стандартом, так как я получаю:
...
>>> response = ldap_manager.authenticate('me', 'my_pass')
LDAPNoSuchObjectResult - 32 - noSuchObject - CN=Schema,CN=Configuration,DC=mydomain,DC=com - 0000208D: NameErr: DSID-0315270B, problem 2001 (NO_OBJECT), data 0, best match of:
'CN=Schema,CN=Configuration,DC=mydomain,DC=com'
- searchResDone - None
Пожалуйста, не стесняйтесь спрашивать дополнительную информацию, и я постараюсь выяснить это как можно лучше. Например, мой собственный пользователь находится в:
CN=Lastname Firstname,OU=Consultants,OU=Users,OU=SE,OU=MYDOMAIN,DC=mydomain,DC=com
Некоторые значения:
objectClass = top;person;organizationalPerson;user
name = Lastname Firstname
userPrincipalName = Firstname.Lastname@mydomain.com
Также из CN=Schema,CN=Configuration,DC=mydomain,DC=com
есть только одна подсхема, которая CN=Aggregate,CN=Schema,CN=Configuration,DC=mydomain,DC=com
и это выглядит пустым. По какой-то причине я верю, что именно это пытается использовать flask-ldap3-login.
1 ответ
Моя проблема с использованием ldap3.Connection
было то, что я не использовал логин при привязке. Это, кажется, путь вперед:
import ldap3
user = 'me@mycompany.com'
password = 'mypassword'
server = ldap3.Server('myserver')
connection = ldap3.Connection(server, user=user, password=password)
connection.bind()
connection.search(search_base='DC=mycompany,DC=com', search_filter='(&(objectClass=user)(userPrincipalName='+user+'))', search_scope='SUBTREE', attributes='*')
И если вы хотите напечатать некоторые данные:
attrs = connection.response[0]['attributes']
print(attrs['displayName'])
for memb in attrs['memberOf']:
print(memb.partition('=')[2].partition(',')[0])