ldap_bind_s возвращает LDAP_SUCCESS с неверными учетными данными - PullRequest
2 голосов
/ 20 июля 2009

У меня есть маленькая проблема. Я хочу аутентифицировать пользователя по LDAP (Windows Active Directory), все работает нормально, но комбинация (хороший пользователь, хороший пароль, неправильный домен).

LDAP* ldap = ldap_init(L"myserver", 389);
ULONG ldap_version = 3;

ULONG ret = LDAP_SUCCESS;

ret = ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, (void*)&ldap_version);
ret = ldap_connect(ldap, NULL);

SEC_WINNT_AUTH_IDENTITY ai;
ai.Domain = (unsigned short*)BAD_DOMAIN;
ai.DomainLength = wcslen(BAD_DOMAIN);
ai.User = (unsigned short*)OK_USER;
ai.UserLength = wcslen(OK_USER);
ai.Password = (unsigned short*)OK_PASS;
ai.PasswordLength = wcslen(OK_PASS);
ai.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;

ret = ldap_bind_s(ldap, NULL, (PWCHAR) &ai, LDAP_AUTH_NTLM); // !!! HERE !!!
ret = ldap_unbind_s(ldap);

На линии marke '!!! ВОТ !!!' Я ожидаю 0x31 или любую другую ошибку. Вместо этого я получаю LDAP_SUCCESS: (

Есть предложения? Спасибо, Милан

Ответы [ 2 ]

1 голос
/ 26 апреля 2010

Привязка выполнена успешно, поскольку имя пользователя и пароль пары действительны для домена, к которому вы подключены во время вызова ldap_init. В этом случае домен, указанный в учетных данных, просто игнорируется.

Чтобы подтвердить этот статус, вы можете попробовать использовать некоторые учетные данные из доверенного домена этого сервера. Поскольку пользователь не существует в домене, к которому вы подключены, предоставление неверного доменного имени приведет к ошибке привязки с INVALID_CREDENTIALS.

Надеюсь, это поможет.

1 голос
/ 29 июля 2009

Проверяете ли вы возвращаемые значения из ldap_init (), ldap_set_option () и ldap_connect ()?

Я бы попробовал использовать структуру SEC_WINNT_AUTH_IDENTITY_EX и указать версию и длину.

В противном случае ваш код выглядит мне правильно.

Это может также привести к анонимному доступу или доступу как зарегистрированный пользователь.

Windows может быть весьма «полезной» в сопоставлении строк домена и имени пользователя. Что вы передаете за домен? Это правдоподобная, но несуществующая доменная строка? Если он нарушает правила именования, он может быть проигнорирован, и пользователь будет соответствовать, как если бы вы не указали имя пользователя. В частности, известные имена пользователей, такие как «Администратор», в конечном итоге совпадают практически с любым локальным компьютером или доменом.

Вы пытались выполнить простой запрос со связанным соединением?

Существует странный случай, когда связывание будет успешно выполнено с использованием недавно истекшего пароля, но затем произойдет сбой какой-либо операции для последующего связывания на том же соединении произвольно. Я не думаю, что это то, что вы видите, однако. Если вы столкнетесь с этим странным случаем, я думаю, что решение где-то здесь похоронено: http://support.microsoft.com/default.aspx?scid=kb;EN-US;823659

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...