2014-12-03 49 views
0

我正在用C++編寫一個程序,該程序連接到Active Directory服務器,搜索內容,然後將該內容轉儲到終端。我的問題是,我能夠成功進行身份驗證和連接的唯一方法是使用用戶的顯示名稱(例如測試用戶)。我想改變這種身份驗證方法來改爲使用用戶的登錄名。 (如[email protected]使用用戶登錄名稱而不是顯示名稱對Active Directory進行身份驗證

這裏是負責建立會話的代碼:

char * _hostName = "The_Computer_Name"; 
char * _dn = "CN=Test User,DC=EXAMPLE,DC=COM"; 
char * _ps = "The_Password123"; 

int ldap_Query::session_init(){ 

    if (_pLdapConnection != nullptr) return 0; 

    _pLdapConnection = ldap_init(_hostName, LDAP_PORT); 
    if (_pLdapConnection == nullptr) { 
     int err = ldap_get_option(_pLdapConnection, LDAP_OPT_ERROR_NUMBER, &err); 
     throw LdapQueryException(ldap_err2string(err)); 
     } 


    unsigned long lRtn = ldap_simple_bind_s(_pLdapConnection, _dn,_ps); 
    if (lRtn != LDAP_SUCCESS) { 
     ldap_unbind(_pLdapConnection); 
     _pLdapConnection = nullptr; 
     throw LdapQueryException(ldap_err2string(lRtn)); 
     } 

    return 0; 
} 

我想我正在尋找被稱爲用戶主體名稱,但還沒有看到使用它進行身份驗證的示例。我試過用「CN = Tuser,DC = EXAMPLE,DC = COM」來代替_dn,但是沒有運氣。

感謝您的幫助!

回答

2

您無法直接使用upn名稱進行ldap綁定。

當您通過ldap簡單地綁定到目錄時,您需要使用您綁定的用戶的完全限定DN和他們的密碼。

要以您想要的方式使用userprincipalname屬性,您需要使用服務帳戶或匿名(如果允許)搜索用戶。

用這樣的東西搜索。

(&(objectclass=user)(userprincipalname=<supplied value>)) 

如果獲得匹配並綁定用戶,則從生成的用戶條目中獲取DN。

+0

您能澄清一下:「您需要使用服務帳戶或匿名(如果允許)使用其提供的userprincipalname屬性搜索用戶。」?這是否意味着,我需要嘗試使用管理員帳戶進行身份驗證,或嘗試先不使用憑據進行連接,然後使用該過濾器執行搜索?似乎我可能只是使用這些憑證執行搜索記錄,而不是嘗試以用戶身份進行身份驗證。 – Josh 2014-12-04 16:24:28

+0

是的,你需要綁定到目錄,以便你可以搜索它。某些目錄將被配置爲允許匿名綁定,並可能將一部分屬性返回給匿名綁定。這在Active Directory中不典型。您通常需要綁定一個可搜索的服務帳戶,以便您可以找到該用戶。你在使用用戶的憑據做一個捕獲22,但是;您需要一個DN才能執行綁定,但在綁定之前無法獲取DN。通常,應用程序將與目錄服務器建立開放連接以搜索用戶。 – 2014-12-04 17:18:16

+0

如果您面向更多以Windows爲中心的工具,則可以直接使用upn,DOMAIN \ username進行綁定,但您在此時放棄了LDAP的靈活性。 – 2014-12-04 17:19:33

相關問題