C#:如何在启用SSL的情况下连接到Active Directory?

C#:如何在启用SSL的情况下连接到Active Directory?,c#,ssl,active-directory,C#,Ssl,Active Directory,我正在从事的项目将与客户的Active Directory集成,以便对用户进行身份验证。我一直在尝试编写一些代码来检索用户密码,我知道Active Directory只会通过端口636上的SSL连接公开相关属性 以下代码在不使用SSL的情况下以编程方式连接,但我看不到密码属性: static void Main(string[] args) { DirectoryEntry entry = new DirectoryEntry(@"LDAP://<IP>/CN=LDAP Te

我正在从事的项目将与客户的Active Directory集成,以便对用户进行身份验证。我一直在尝试编写一些代码来检索用户密码,我知道Active Directory只会通过端口636上的SSL连接公开相关属性

以下代码在不使用SSL的情况下以编程方式连接,但我看不到密码属性:

static void Main(string[] args)
{
    DirectoryEntry entry = new DirectoryEntry(@"LDAP://<IP>/CN=LDAP Test,CN=Users,DC=customer,DC=com");
    entry.AuthenticationType = AuthenticationTypes.None;
    entry.Username = "CN=LDAP Test,CN=Users,DC=customer,DC=com";
    entry.Password = "<password>";
    if (entry != null)
    {
        foreach (Object propName in entry.Properties.PropertyNames)
        {
            Console.WriteLine((String)propName);
        }
    }
}
static void Main(字符串[]args)
{
DirectoryEntry=new DirectoryEntry(@“LDAP:///CN=LDAP测试,CN=Users,DC=customer,DC=com”);
entry.AuthenticationType=AuthenticationTypes.None;
entry.Username=“CN=LDAP测试,CN=Users,DC=customer,DC=com”;
entry.Password=“”;
if(条目!=null)
{
foreach(entry.Properties.PropertyNames中的对象propName)
{
Console.WriteLine((String)propName);
}
}
}
当我将代码更改为使用SSL时,我得到一个异常声明;未知错误(0x80005000)”

我在托管Active Directory的服务器上启用了SSL,在同一服务器上安装了Microsoft CA,并从CA获得了证书

我可以使用ApacheDirectoryStudio通过SSL连接到Active Directory,但不显示密码属性

以下代码显示了我一直尝试使用SSL连接的内容:

static void Main(string[] args)
{
    DirectoryEntry entry = new DirectoryEntry(@"LDAPS://<IP>:636/CN=LDAP Test,CN=Users,DC=customer,DC=com");
    entry.AuthenticationType = AuthenticationTypes.SecureSocketsLayer;
    entry.Username = "CN=LDAP Test,CN=Users,DC=customer,DC=com";
    entry.Password = "<password>";
    if (entry != null)
    {
        foreach (Object propName in entry.Properties.PropertyNames)
        {
            Console.WriteLine((String)propName);
        }
    }
}
static void Main(字符串[]args)
{
DirectoryEntry=新的DirectoryEntry(@“LDAPS://:636/CN=LDAP测试,CN=Users,DC=customer,DC=com”);
entry.AuthenticationType=AuthenticationTypes.SecureSocketsLayer;
entry.Username=“CN=LDAP测试,CN=Users,DC=customer,DC=com”;
entry.Password=“”;
if(条目!=null)
{
foreach(entry.Properties.PropertyNames中的对象propName)
{
Console.WriteLine((String)propName);
}
}
}

我不知道该怎么办,非常感谢您的帮助。

尝试将服务器的证书和根证书添加到本地存储中。最简单的方法是使用IE连接到。然后单击所有证书屏幕并将其添加到您的应用商店中

我一直在尝试写一些代码 这将检索用户密码

这与SSL问题无关,但我认为从Active Directory检索用户密码是不可能的。它只存储一个散列,这就是为什么在查询用户属性时没有收到任何类型的“密码”属性

更新的答案

在阅读您的评论之后,您似乎正在查找包含安全哈希的unicodePwd属性。根据,写入该属性需要特殊的SSL连接,但您仍然无法读取它,因为它是一个只写属性

特别是MSDN:

LDAP搜索从不返回unicodePwd属性

这里还有一个论坛帖子,我发现它似乎说了同样的话:

用户的密码存储在 中用户对象上的Active Directory unicodePwd属性。这 属性可以写在下面 限制条件,但它不能 由于安全原因无法读取。 ()


相关:ADAM常见问题解答在这里:这个问题的标题有误导性,应该是“如何从Active Directory检索用户密码?”它与“启用SSL连接到Active Directory”无关,而是我想要的哈希值。我承认我的帖子本可以更清楚地说明这一点。其目的是将从另一个系统接收的哈希与存储在Active Directory中的哈希进行比较或授权。