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

时间:2009-08-04 17:54:32

标签: c# ssl active-directory

我正在处理的项目将与客户A​​ctive 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);
        }
    }
}

当我更改代码以使用SSL时,我得到一个异常陈述;未知错误(0x80005000)'。

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

我可以使用Apache Directory Studio通过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);
        }
    }
}

我不知道该怎么做,非常感谢一些帮助。

2 个答案:

答案 0 :(得分:2)

  

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

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

更新了答案

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

特别是来自MSDN:

  

LDAP搜索永远不会返回unicodePwd属性。

这里也是一个论坛帖子,我发现它似乎也说了同样的事情:

  

用户的密码存储在   用户对象上的Active Directory   unicodePwd属性。这个   属性可以写下来   限制条件,但它不能   因安全原因阅读。   (MSDN information

答案 1 :(得分:0)

尝试将服务器的证书和根证书添加到本地商店。最简单的方法是使用IE连接到https://your.domain.contoller:636。然后单击所有证书屏幕并将其添加到您的商店。