LDAPS连接的未知错误(0x80005000)

时间:2012-04-03 13:07:25

标签: c# .net active-directory ldap

在过去的几个小时里,我在一个讨厌的Active Directory位上被困住了。

我要完成的是通过SSL通过LDAP连接到Active Directory。身份验证类型是匿名的。我正在使用.NET Framework 4.0,C#和Visual Studio 2010。

以下代码应根据各种在线资源运行。但它不断提出令人惊讶的不言自明:“未知错误(0x80005000)”。

DirectoryEntry entry = new DirectoryEntry();
entry.Path = "LDAPS://some.ldap.server:636";
entry.AuthenticationType = AuthenticationTypes.SecureSocketsLayer;

DirectorySearcher searcher = new DirectorySearcher();
searcher.searchRoot = entry;
searcher.Filter = "(&(objectCategory=person)(objectClass=user))";

SearchResultCollection results = searcher.FindAll();

我已经将我想要执行的实际查询简化为您在代码中找到的查询。但即使使用这种通用查询(它应该返回每个AD的工作?),它也会返回错误。

3 个答案:

答案 0 :(得分:13)

最后!

似乎ASP.NET应用程序没有权限(或不知道如何)在机器级别检查受信任的证书存储区。由于证书是自签名的,因此ASP.NET应用程序拒绝建立连接。

我使用自定义证书验证修复了问题。 以下代码可以解决问题:

LdapConnection con = new LdapConnection(new LdapDirectoryIdentifier("server", port));
con.SessionOptions.SecureSocketLayer = true;
con.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback(ServerCallback);
con.Credential = new NetworkCredential(String.Empty, String.Empty);
con.AuthType = AuthType.Basic;
con.Bind();

由于我确信证书有效,ServerCallBack方法如下所示:

public static bool ServerCallBack(LdapConnection connection, X509Certificate certificate)
{
    return true;
}

但是,您当然可以随时从本地计算机中检索证书并进行验证。

此示例中使用的命名空间是:

System.DirectoryServices.Protocols;

这是因为命名空间:

System.DirectoryServices.DirectoryEntry

不包含自定义证书验证的方法。

感谢大家的帮助和时间,希望这对未来的人有所帮助!

答案 1 :(得分:2)

据我所知,此错误表示目录路径名存在问题。

  1. 确保“server.domainName”是AD服务器证书中的CN。
  2. 确保“some.domainName”得到妥善解决,在主机文件中添加分辨率以进行测试
  3. 确保“domainName”已妥善解析,在主机文件中添加分辨率以进行测试
  4. 确保颁发服务器证书的证书颁发机构的公钥是在您的计算机受信任的根证书颁发机构商店中。
  5. 尝试这样做:

  6. DirectoryEntry entry = new DirectoryEntry("LDAPS://srventr2.societe.fr:636/DC=societe,DC=fr", "user", "password");
    
    DirectorySearcher searcher = new DirectorySearcher();
    searcher.SearchRoot = entry;
    searcher.SearchScope = SearchScope.Subtree;
    searcher.Filter = "(&(objectCategory=person)(objectClass=user))";
    SearchResultCollection results = searcher.FindAll(); 
    

答案 2 :(得分:1)

根据您的目录服务器(或网络上的元素的配置方式),有时可以进行简单的更改(LDAP与LDAPS,但保留端口号)

entry.Path = "LDAP://some.ldap.server:636";