2014-12-03 27 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

相关问题