我很惊讶这方面的例子如此之少。 我基本上需要对Active Directory进行用户/密码身份验证。 我能够初始化与Active Directory的连接,但它总是给我一个“无效凭据”错误。 我想知道是否我传递了错误的内容。 这是我第一次尝试LDAP。 就此而言,我也可以接受另一种(可能有充分文档记录的)解决方案。
也许不是最好的方法。首先,关键是-D参数,并在末尾传递sAMAccountName。我将没有常见名称-只有Windows登录名和密码。如果密码通过,上述命令将显示用户信息。
其中的警告(我认为)是ldap_sasl_bind_s()没有设置-D(binddn)标志的等效项。查看此问题/答案中的{{link1:链接}},看起来ldap_interactive_bind_s()可能会,但涉及到更多步骤,因为我必须传递回调。
在上面的示例中,我设置了密码,但没有任何绑定dn/用户名,它假设我试图作为谁进行身份验证?
#include <iostream>
#include <stdio.h>
#define LDAP_SERVER "ldap://hq.mydomain.local/"
#include <ldap.h>
int main( int argc, char** argv )
{
LDAP *ld;
int version( LDAP_VERSION3 );
int rc;
char bind_dn[100];
berval creds;
berval* serverCreds;
if( ldap_initialize( &ld, LDAP_SERVER ) ) {
std::cerr << "Error initializing ldap..." << std::endl;
return 1;
}
ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &version );
creds.bv_val = "password";
creds.bv_len = strlen("password");
rc = ldap_sasl_bind_s( ld, "sAMAccountName=MYDOMAIN\\UserName,dc=mydomain,dc=local", "GSSAPI", &creds, NULL, NULL, &serverCreds );
if ( rc != LDAP_SUCCESS ) {
std::cerr << "ERROR: " << ldap_err2string( rc ) << std::endl;
return 1;
} else {
std::cout << "Success." << std::endl;
}
return 0;
}
编辑:
我想确保服务器端一切正常,所以进行了一些ldapsearch测试。起初它没有工作,但最终我成功了(至少在使用ldapsearch时是这样的)。
ldapsearch -D first.last@mydomain.local -H "ldap://hq.mydomain.local:389" -b "ou=Development,ou=Domain Users,dc=mydomain,dc=local" -W "sAMAccountName=first.last"
也许不是最好的方法。首先,关键是-D参数,并在末尾传递sAMAccountName。我将没有常见名称-只有Windows登录名和密码。如果密码通过,上述命令将显示用户信息。
其中的警告(我认为)是ldap_sasl_bind_s()没有设置-D(binddn)标志的等效项。查看此问题/答案中的{{link1:链接}},看起来ldap_interactive_bind_s()可能会,但涉及到更多步骤,因为我必须传递回调。
在上面的示例中,我设置了密码,但没有任何绑定dn/用户名,它假设我试图作为谁进行身份验证?
ldap.h
,并且locate ldap.h
命令也没有任何结果。这可能是一个愚蠢的问题,但我需要安装什么才能获取该库?我在网上找到了很多与LDAP相关的说明,但迄今为止似乎没有什么起作用的。 - MikeElmwood