【发布时间】:2015-07-29 15:14:20
【问题描述】:
我很惊讶在这方面的例子如此之少。我基本上需要对 Active Directory 进行用户/通过身份验证。我能够初始化与活动目录的连接,但它总是给我一个“无效的凭据”错误。我想知道我是否传递了错误的东西。这是我第一次尝试使用 LDAP。就此而言,我愿意接受另一个(也许有据可查的)解决方案。
#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) 标志。看看this question/answer,它看起来像是 ldap_interactive_bind_s() 可能,但它涉及的更多一些,因为我必须回电。
在上面的示例中,我设置了密码,但没有任何类型的 binddn/用户名,它假定我正在尝试以谁身份进行身份验证?
【问题讨论】:
-
嗨!我以前从未使用过 Active Directory,但我正在尝试在 Ubuntu 20.04 上做类似的事情。当我尝试重现您的示例时,编译器找不到
ldap.h并且命令locate ldap.h什么也没有产生。这可能是一个愚蠢的问题,但我需要安装什么才能获得该库?我在网上找到了很多与 LDAP 相关的说明,但目前似乎没有任何效果。
标签: c++ linux active-directory kerberos