通过SSL联系Active Directory

时间:2016-03-04 13:55:20

标签: c# ssl active-directory dmz

我有一个方法可以验证针对Active Directory的用户凭据。我想将此方法与SSL一起使用但我无法使其工作。

主要问题是我有一个服务器在我们网络之外(它叫做DMZ吗?)。从那里我想联系我的活动目录,这就是我想使用SSL的原因。

在我的本地计算机(而不是DMZ)上使用它时,我收到此错误:

  

System.DirectoryServices.AccountManagement.PrincipalServerDownException:无法联系服务器。 ---> System.DirectoryServices.Protocols.LdapException:LDAP服务器不可用   在System.DirectoryServices.Protocols.LdapConnection.Connect()
  在System.DirectoryServices.Protocols.LdapConnection.SendRequestHelper(DirectoryRequest请求,Int32& messageID)
  在System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest请求,TimeSpan requestTimeout)
  在System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request)
  在System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName,ServerProperties& properties)

     
    

---内部异常堆栈跟踪结束---
    at System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName,ServerProperties& properties)
    在System.DirectoryServices.AccountManagement.PrincipalContext.DoServerVerifyAndPropRetrieval()
    at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType,String name,String container,ContextOptions options,String userName,String password)
    at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType,String name,String container,ContextOptions options)
    at Authorization.AuthorizeAD.ValidateCredentials(String username,String password)

  

我认为在我从服务器上尝试使用SSL之前,最好先使用SSL。

我的方法:

public bool ValidateCredentials(string username, string password) {
        using (
            var context = new PrincipalContext(ContextType.Domain, ContextName, ContextContainer,
                ContextOptions.Negotiate | ContextOptions.Signing | ContextOptions.Sealing |
                ContextOptions.SecureSocketLayer)) {
            return context.ValidateCredentials(username, password);
        }
    }

如前所述,没有ContextOptions.SecureSocketLayer它可以正常工作(如果参数为null,则默认为其他三个)

有谁知道我应该如何使用PrincipalContext更正SSL?

1 个答案:

答案 0 :(得分:5)

您确定它支持SSL并且防火墙已打开以允许该连接吗?

LDAP使用端口389.LDAPS使用端口636。

如果安装了telnet客户端,则可以使用它来检查连接:

telnet yourdomain.com 636

如果你看到一个空白的屏幕,它就可以了。如果它无法连接,它会告诉你。

如果它已打开但仍然无效,则可能是使用自签名SSL证书。检查Windows事件日志中是否存在与证书相关的错误。

我还使用Chrome查看证书。你必须像这样运行chrome:

chrome.exe --explicitly-allowed-ports=636

然后浏览到https://yourdomain.com:636,看看它是否为您提供了任何证书错误。然后你就可以看到证书了。如果出现问题,您可以导入证书并明确信任它。