ldap_bind_s使用错误的凭据返回LDAP_SUCCESS

时间:2009-07-20 13:51:17

标签: authentication ldap

我有这个小问题。我想针对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);

在线上市场'!!!这里 !!!'我希望返回0x31或任何其他错误。相反,我获得LDAP_SUCCESS :(

有什么建议吗? Thx,米兰

2 个答案:

答案 0 :(得分:1)

您是否正在检查ldap_init(),ldap_set_option()和ldap_connect()的返回值?

我会尝试使用SEC_WINNT_AUTH_IDENTITY_EX结构并填写版本和长度。

否则,您的代码对我来说是正确的。

它也可以回退到匿名访问,或作为登录用户访问。

Windows在匹配域名和用户名字符串方面非常“有用”。你为域名传递了什么?它是一个看似合理但不存在的域名字符串吗?如果它违反了命名规则,则可以忽略它,并且用户匹配,就像您没有指定用户名一样。特别是,像“管理员”这样的众所周知的用户名最终只匹配任何本地机器或域。

您是否尝试过使用绑定连接进行简单查询?

有一种奇怪的情况,绑定将使用最近过期的密码成功,但随后会导致同一连接上的后续绑定的某些操作失败。我不认为这是你所看到的。如果您遇到这种奇怪的情况,我认为解决方案隐藏在某处:http://support.microsoft.com/default.aspx?scid=kb;EN-US;823659

答案 1 :(得分:1)

绑定是成功的,因为情侣用户名/密码对于您在ldap_init调用期间连接的域有效。在这种情况下,凭据中提供的域将被忽略。

要确认此声明,您可以尝试使用此服务器的受信任域中的某些凭据。由于您所连接的域中不存在该用户,因此提供无效的域名将导致与INVALID_CREDENTIALS绑定失败。

希望有所帮助。