我正在处理的项目将与客户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);
}
}
}
当我更改代码以使用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);
}
}
}
我不知道该怎么做,非常感谢一些帮助。
答案 0 :(得分:2)
我一直在尝试编写一些代码 这将检索用户密码...
这与您的SSL问题无关,但我认为无法从Active Directory检索用户密码。它只存储一个哈希,这就是为什么在查询用户属性时你没有收到任何类型的“密码”属性。
更新了答案
阅读完评论后,您似乎正在寻找包含安全哈希的unicodePwd属性。根据{{3}},写入该属性需要特殊的SSL连接,但您仍然无法读取它,因为它是一个只写属性。
特别是来自MSDN:
LDAP搜索永远不会返回unicodePwd属性。
这里也是一个论坛帖子,我发现它似乎也说了同样的事情:
用户的密码存储在 用户对象上的Active Directory unicodePwd属性。这个 属性可以写下来 限制条件,但它不能 因安全原因阅读。 (MSDN information)
答案 1 :(得分:0)
尝试将服务器的证书和根证书添加到本地商店。最简单的方法是使用IE连接到https://your.domain.contoller:636。然后单击所有证书屏幕并将其添加到您的商店。