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

Rob*_*aas 11 .net c# ldap active-directory

在烦人的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();
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*aas 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();
Run Code Online (Sandbox Code Playgroud)

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

public static bool ServerCallBack(LdapConnection connection, X509Certificate certificate)
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但是,您当然可以始终从本地计算机检索证书并对其进行验证.

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

System.DirectoryServices.Protocols;
Run Code Online (Sandbox Code Playgroud)

这是因为命名空间:

System.DirectoryServices.DirectoryEntry
Run Code Online (Sandbox Code Playgroud)

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

谢谢大家的帮助和时间,希望这将有助于未来的人!


cur*_*isk 5

根据您的目录服务器(或网络上的元素的配置方式),有时像这样的简单更改将起作用(LDAP 与 LDAPS,但保留端口号)

entry.Path = "LDAP://some.ldap.server:636";
Run Code Online (Sandbox Code Playgroud)

  • 它对我有帮助,但不确定导致这种行为的特定 AD 配置是什么。另外一个有趣的行为是,当您在 URL 中以小写形式给出 ldap 协议名称时,它不起作用,即“LDAP://some.ldap.server:636”可以工作,但“ldap://some.ldap.server”可以工作。 :636”没有。我特别被这个吓到了。 (2认同)