这篇文章目前还没有实现具体的功能,只实现了明文登录,因为我缺少一些数据,比如通过密码生成hash,以及通过challenge生成response,我不知道怎么实现,因此这篇文章也是一个交流的文章,希望大佬看见提个建议,我在功能实现后也会补全该文章。
环境:1.服务器 windows server 2022 中文版 AD (推荐下载windows server 2012 R2)
2.语言:C++
3.实现流程中的API:依赖openldap 2.6库
1.NTLM认证是什么?流程是什么?AD服务器是什么?
在这里我不过多述说,推荐还不懂的浏览以下文章,搞懂NTLM流程
2.通过LDAP连接到AD服务器
2.1:创建LDAP句柄指针
之后所有的操作都是基于LDAP指针进行操作,例如增删改查AD服务的数据
//ldap是自定义的,uri是string类型的IP地址,端口AD都默认为389 ldap://<IP>:389
LDAP *ldap;
std::string uri = "ldap://192.168.XXX.XXX:389";
int rc = ldap_initialize(&ldap, uri.c_str());
if (rc != LDAP_SUCCESS)
{
std::cerr << "ldap_initialize failed: " << ldap_err2string(rc) << std::endl;
return rc;
}
2.2: 协商ldap的版本
//这些都是固定参数,当然你也可用不协商使用ldap版本,亲测明文登录依旧可以增删改查
int version = LDAP_VERSION3
rc = ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &version);
if (rc != LDAP_SUCCESS)
{
std::cerr << "ldap_set_option failed: " << ldap_err2string(rc) << std::endl;
return rc;
}
2.3协商使用NTLM认证,明文登录不需要做
// 3.设置认证方式为NTLM,我不知道这是否有效,但是服务器却没有拒绝我
int option = LDAP_OPT_X_SASL_MECH;
const char *mech = "