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

Posted

技术标签:

【中文标题】C#:如何在启用 SSL 的情况下连接到 Active Directory?【英文标题】:C#: How to connect to Active Directory with SSL enabled? 【发布时间】:2009-08-04 17:54:32 【问题描述】:

我正在进行的项目将与客户的 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);
        
    

我不知道该怎么做,我们将不胜感激。

【问题讨论】:

相关:***.com/questions/287100/… ADAM 常见问题解答在这里:microsoft.com/windowsserver2003/adam/ADAMfaq.mspx#EOD 这个问题的标题具有误导性,应该类似于“如何从 Active Directory 中检索用户密码?”它与“启用 SSL 连接到 Active Directory?”无关? 【参考方案1】:

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

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

更新答案

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

具体来自 MSDN:

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

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

用户的密码存储在 Active Directory 中的用户对象 unicodePwd 属性。这 属性可以写在 限制条件,但不能 出于安全原因阅读。 (Source)

【讨论】:

这是我所追求的哈希值。我承认我的帖子本来可以更清楚地说明这一点。目的是比较或授权从另一个系统接收到的哈希与存储在 Active Directory 中的哈希。【参考方案2】:

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

【讨论】:

以上是关于C#:如何在启用 SSL 的情况下连接到 Active Directory?的主要内容,如果未能解决你的问题,请参考以下文章

如何在启用 tls 的情况下连接到 nomad/consul UI?

C# - 在没有许可证的情况下连接到 DB2 z/os 大型机

如何在没有认证问题的情况下连接到 URL?

如何在不使用 *** 映像的情况下连接到 docker 中的 ***?

如何在不指定数据库名称的情况下连接到 PostgreSQL?

如何在没有 oAuth 身份验证的情况下连接到 Google Calendar API?