2009-07-20 62 views
2

我有這個小問題。我想通過LDAP(Windows Active Directory)對用戶進行身份驗證,一切正常,但組合(用戶名,密碼錯誤,域錯誤)。ldap_bind_s返回帶有錯誤憑證的LDAP_SUCCESS

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,米蘭

回答

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

+0

嗨,我會嘗試'EX'版本的結構。 關於返回值,當然我正在檢查它們。這只是一個簡短的測試案例。 無論如何thx,rezna – rezna 2009-08-17 11:28:20

1

綁定是成功的,因爲這對夫婦用戶名/密碼對於在ldap_init調用期間連接的域有效。在這種情況下,憑證中提供的域將被忽略。

要確認此陳述,您可以嘗試使用此服務器的受信任域中的某些憑證。由於用戶不在所連接的域中,因此提供無效的域名將導致INVALID_CREDENTIALS的綁定失敗。

希望有所幫助。

相關問題