我目前使用ldap_bind_s绑定到我的C应用程序中的SEC_WINNT_AUTH_IDENTITY结构的服务器,但该函数被标记为已弃用。因此,我想将其更改为ldap_sasl_bind_s函数。
int main(void) {
LDAP *ld;
int rc = 0;
char *binddn = "cn=admin,dc=local";
const int version = LDAP_VERSION3;
SEC_WINNT_AUTH_IDENTITY wincreds;
struct berval saslcred;
wincreds.User = "admin";
wincreds.UserLength = 5;
wincreds.Password = "secret";
wincreds.PasswordLength = 6;
wincreds.Domain = NULL;
wincreds.DomainLength = 0;
wincreds.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
ld = ldap_initA("localhost", LDAP_PORT);
ldap_set_optionA(ld, LDAP_OPT_PROTOCOL_VERSION, &version);
rc = ldap_bind_sA(ld, binddn, (PCHAR)&wincreds, LDAP_AUTH_DIGEST);
printf("0x%x\n", rc); // It's OK (0x0)
ldap_unbind(ld);
saslcred.bv_val = "secret";
saslcred.bv_len = 6;
rc = ldap_sasl_bind_sA(ld, binddn, "DIGEST-MD5", &saslcred, NULL, NULL, NULL);
printf("0x%x\n", rc); // Returns with 0x59
ldap_unbind(ld)
return 0;
}
字符串
ldap_sasl_bind_s返回LDAP_PARAM_ERROR代码。显然,上面的函数参数是错误的,但是我找不到一个使用winldap和SASL绑定的工作示例代码。
我将非常感谢一些指导,如何使这段代码工作。
2条答案
按热度按时间sqyvllje1#
ldap_sasl_bind_sA
的最后一个参数不能为NULL。它必须指向函数可以放置服务器响应(struct berval*
)的位置。字符串
t5zmwmid2#
所以最后,经过过去两周的研究和调试,我成功地编写了一个使用 DIGEST-MD5 身份验证和WinLDAP的 ldap_sasl_bind_s 函数的工作示例代码。对应的RFC,这个答案和官方的SSPI documentation给了我很多帮助。
我遇到的一些问题:
我希望它能帮助其他人花更少的时间来弄清楚如何在WinLDAP中使用SASL绑定机制。
字符串