设置快速并发绑定时,LDAP over SSL返回“不愿意执行”错误(PrincipalContext.ValidateCredentials)

时间:2017-05-26 11:08:16

标签: c# ssl active-directory ldap directoryservices

最初的问题始于.NET \ C#和ValidateCredentials方法 - 没有SSL它可以工作,使用SSL它返回'服务器无法处理目录请求'。但我将其缩小并简化为下面发布的C ++代码。

MSDN表示LDAP_OPT_FAST_CONCURRENT_BIND支持多个简单绑定,但不适用于后两个选项:LDAP_OPT_SIGNLDAP_OPT_ENCRYPT。它还说使用不带SSL的简单绑定是not good,因为当您通过网络发送时,您将以明文形式公开您的凭据。

因此,似乎在没有签名和加密的情况下使用LDAP over SSL时,您可以启用FCB。但每次我这样做,我收到0x35(不愿意执行)。关于密码身份验证的Article也没有说明SSL。所以,问题是 - 我做错了什么?或者,Microsoft可能在其文档中声明LDAP_OPT_FAST_CONCURRENT_BIND不支持SSL?

#include "stdafx.h"
#include <windows.h>
#include <winldap.h>

int main()
{
    PCHAR username = "bla-bla-bla";
    PCHAR password = "bla-bla-bla";
    PCHAR hostName = "bla-bla-bla";
    ULONG lRtn = 0;
    LDAP* pLdapConnection = NULL;

    pLdapConnection = ldap_init(hostName, LDAP_PORT);

    // NOTE: those 2 below - will return 0x35 (Unwilling to perform) during setting LDAP_OPT_FAST_CONCURRENT_BIND option
    //pLdapConnection = ldap_init(hostName, LDAP_SSL_PORT);
    //pLdapConnection = ldap_sslinit(hostName, LDAP_SSL_PORT, 1);

    if (pLdapConnection == NULL)
    {
        printf("ldap_init failed with 0x%x.\n", LdapGetLastError());
        ldap_unbind(pLdapConnection);
        return -1;
    }
    else
        printf("ldap_init succeeded \n");

    lRtn = ldap_connect(pLdapConnection, NULL);
    if (lRtn == LDAP_SUCCESS)
        printf("ldap_connect succeeded \n");
    else
    {
        printf("ldap_connect failed with 0x%lx.\n", lRtn);
        ldap_unbind(pLdapConnection);
        return -1;
    }

    // Enable concurrent binding - returns 0x35 when used with SSL.
    lRtn = ldap_set_option(pLdapConnection, LDAP_OPT_FAST_CONCURRENT_BIND, LDAP_OPT_ON);
    if (lRtn == LDAP_SUCCESS)
        printf("Fast concurrent binding enabled\n");
    else
    {
        printf("SetOption Error:%0lX\n", lRtn);
        ldap_unbind(pLdapConnection);
        return -1;
    }

    lRtn = ldap_simple_bind_s(pLdapConnection, username, password);
    if (lRtn == LDAP_SUCCESS)
    {
        printf("ldap_simple_bind_s succeeded \n");
        password = NULL;         // Remove password pointer
    }
    else
    {
        printf("ldap_bind_s failed with 0x%lx.\n", lRtn);
        ldap_unbind(pLdapConnection);
        return -1;
    }

    ldap_unbind(pLdapConnection);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

请在此处查看我的回复:PathAddBackslash()

  

或者,Microsoft可能会在其文档中声明LDAP_OPT_FAST_CONCURRENT_BIND不支持SSL吗?

一般情况下,它不是SSL,它是相互 SSL。