Подобно этому вопросу , я пытаюсь выполнить простую аутентификацию в Active Directory 2003 года с помощью python ldap (CentOS 6.2 x86_64, Python 2.6.6, python-ldap 2.3 .10).
Несмотря на выполнение всех обычных шагов в инициализации, включая
conn.set_option(ldap.OPT_REFERRALS, 0)
, если я передаю правильные учетные данные, я всегдаполучаю (97, [])
возвращенный:
>>> import ldap
>>> conn = ldap.initialize('ldap://ad.server.domain.com')
>>> conn.protocol_version = 3
>>> conn.set_option(ldap.OPT_REFERRALS, 0)
>>> conn.simple_bind_s('user@domain.com', 'WrongPassword')
ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece', 'desc': 'Invalid credentials'}
>>> conn.simple_bind_s('user@domain.com', 'CorrectPassword')
(97, [])
Код ошибки 97 не является успешным; это ошибка LDAP_REFERRAL_LIMIT_EXCEEDED
, возвращаемая из AD. Я также не могу использовать его в качестве де-фактоиндикатора успеха, потому что:
>>> conn.simple_bind_s('', 'CorrectPassword')
(97, [])
>>> conn.simple_bind_s('', '')
(97, [])
Еще больше разочаровывает то, что этот скрипт является переходом от старого Perl-скрипта с использованием Net::LDAP, который делаетвозвращает 0 для успешной аутентификации привязки к тому же AD и серверу.
Вся информация, которую я могу найти на python-ldap, указывает на то, что то, что я делаю, должно просто работать; Я был бы склонен думать, что с серверами AD что-то не так, но сценарий Perl действительно возвращает правильный код LDAP при успешном связывании.
Я протестировал python-ldap 2.2.0 и python 2.4.4 на старой машине с CentOS 5.5, которая лежала у меня без дела, и она "не работает" точно так же.
Кто-нибудь знает, что мне не хватает?
РЕДАКТИРОВАТЬ: По запросу вот работающий Perl-скрипт. Net::LDAP
возвращает код возврата с сервера LDAP, а сервер AD возвращает 0x00, «Успешный запрос», AFAICT.
#!/usr/bin/perl -w
use strict;
use Net::LDAP;
## Corporate subdomains
my @domains = ("americas", "asia", "europe");
# AD connect timeout
my $timeout = 10;
# Set AD server info.
my $port = "389";
my $host = "server.domain.com";
my $user = shift @ARGV;
chomp $user;
my $password = ;
$password =~ s/\r\n//;
chomp $password;
my $ldap = Net::LDAP->new($host, port => $port, timeout => $timeout ) ||
die "Unable to connect to LDAP server";
my $bind_return = 1;
foreach (@domains) {
my $result = $ldap->bind( "$user\@$_.domain.com", password => $password );
if( $result->code == 0) {
$bind_return = 0;
last;
}
}
## Unbind and return
$ldap->unbind;
if ($bind_return) { print "Authentication Failed. Access Denied\n" }
exit $bind_return;