【问题标题】:How to get Domains from a forest from Active Directory over LDAP SSL in c#如何在 c# 中通过 LDAP SSL 从 Active Directory 的林中获取域
【发布时间】:2021-06-09 18:13:26
【问题描述】:

我目前正在使用以下代码从当前林中获取域。

Forest currentForest = Forest.GetCurrentForest();
DomainCollection domainCollection = currentForest.Domains;

此方法使用 LDAP 协议通过端口 389 与 AD 通信。 我正在寻找通过端口 636 (LDAP SSL) 进行相同调用的替代方法。

【问题讨论】:

    标签: c# ssl active-directory ldap directoryservices


    【解决方案1】:

    这似乎是不可能的。 System.DirectoryServices.ActiveDirectory 使用 System.DirectoryServices.DirectoryEntry 反过来 uses ADSI underneath 获取数据:

    System.DirectoryServices 命名空间

    提供从托管代码对 Active Directory 域服务的轻松访问。命名空间包含两个组件类,DirectoryEntry 和 DirectorySearcher,它们使用 Active Directory 服务接口 (ADSI) 技术。

    ADSI 本身支持two types of encryption:基于 Kerberos 和基于 SSL。来自文档:

    基于 Kerberos 的加密

    要使用基于 Kerberos 的加密,请在调用 ADsOpenObjectIADsOpenDSObject::OpenDSObject 时指定 ADS_USE_SEALING 标志。 ADS_USE_SEALING 标志也可用于验证数据完整性,即确保接收到的数据与发送的数据相同。如果指定了ADS_USE_SEALING 标志,则ADS_USE_SIGNING 标志也会自动指定。这两个标志都需要 Kerberos 身份验证,该身份验证仅在以下条件下有效:

    • 客户端计算机必须登录到 Windows 域或 Windows 域信任的域。
    • ADsOpenObjectIADsOpenDSObject::OpenDSObject 必须使用空凭据调用;也就是说,不能指定备用凭据。

    基于 SSL 的加密

    要使用基于 SSL 的加密,请在调用 ADsOpenObjectIADsOpenDSObject::OpenDSObject 时指定 ADS_USE_SSL 标志。如果仅指定了ADS_USE_SSL 标志,ADSI 将打开 SSL 端口 636,然后在该 SSL 通道上执行简单绑定。如果同时指定了ADS_SECURE_AUTHENTICATIONADS_USE_SSL 标志,则绑定行为取决于发出调用的客户端。在不受支持的 Windows 版本上,ADSI 首先打开一个 SSL 通道,并使用指定的用户名和密码或当前用户上下文(如果用户名和密码均为空)执行简单绑定。在受支持的 Windows 版本上,ADSI 执行安全身份验证而不是简单绑定。

    这意味着为了进行 SSL 身份验证,需要为 ADSI 绑定指定附加标志。这在System.DirectoryServices.ActiveDirectory 中是不可配置的,正如相关的code 所说:

    AuthenticationTypes authType = Utils.DefaultAuthType;
    
    if (useServerBind)
    {
        authType |= AuthenticationTypes.ServerBind;
    }
    
    de = new DirectoryEntry(ldapPath, username, password, authType);
    

    这些身份验证标志被硬编码为Utils.DefaultAuthType,即defined

    internal const AuthenticationTypes DefaultAuthType = AuthenticationTypes.Secure | AuthenticationTypes.Signing | AuthenticationTypes.Sealing;
    

    因此,您不能指定 AuthenticationTypes.SecureSocketsLayer 的附加标志来获得 SSL 加密,但标准标志集与 ADSI 默认启用的 Kerberos 加密兼容。如果您满足要求(没有自定义凭据的已加入域的计算机),通信将使用 Kerberos 自动加密,无需任何进一步设置。这可以通过 Wireshark 进行验证(注意 rootDSE 的初始读取以普通、绑定请求和所有以下与加密有效负载的通信):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      相关资源
      最近更新 更多