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

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

以下代码以编程方式连接而不使用SSL,但后来我看不到密码属性:

static void Main(string[] args) { DirectoryEntry entry = new DirectoryEntry(@"LDAP:///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 = ""; if (entry != null) { foreach (Object propName in entry.Properties.PropertyNames) { Console.WriteLine((String)propName); } } } 

当我更改代码以使用SSL时,我得到一个exception说明;未知错误(0x80005000)’。

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

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

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

 static void Main(string[] args) { DirectoryEntry entry = new DirectoryEntry(@"LDAPS://: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 = ""; if (entry != null) { foreach (Object propName in entry.Properties.PropertyNames) { Console.WriteLine((String)propName); } } } 

我不知道该去哪里,一些帮助将不胜感激。

我一直在尝试编写一些可以检索用户密码的代码……

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

更新的答案

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

特别是来自MSDN:

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

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

用户密码存储在unicodePwd属性中用户对象的Active Directory中。 此属性可以在受限条件下写入,但由于安全原因无法读取。 ( 来源 )

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