LDAPS 连接出现未知错误 (0x80005000)

问题描述 投票:0回答:5

过去几个小时我一直被烦人的 Active Directory 位困扰。

我想要完成的是通过 LDAP over SSL 连接到 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 上的工作?),它也会返回错误。

c# .net active-directory ldap
5个回答
14
投票

终于!

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

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

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


6
投票

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

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

3
投票

据我记得这个错误意味着目录路径名有问题。

  1. 请确保“server.domainName”是您的AD服务器证书中的CN。
  2. 确保“some.domainName”已正确解析,将分辨率添加到您的主机文件中进行测试
  3. 确保“域名”已正确解析,将解析添加到您的主机文件中进行测试
  4. 确保颁发服务器证书的证书颁发机构的公钥位于您的计算机受信任的根证书颁发机构存储中。
  5. 尝试这样做:

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(); 

0
投票

对我来说,启动和停止相应的 IIS 网站解决了问题。


0
投票

对我来说,以下配置有效:

  1. 路径就像
    LDAP://some.ldap.server:636

注1:

LDAP
中的字母全部大写。小写字母
ldap
不起作用。

注2:

LDAP
,不是
LDAPS
LDAPS
没用。

注3:端口

636

  1. 身份验证类型只是
    AuthenticationTypes.SecureSocketsLayer
© www.soinside.com 2019 - 2024. All rights reserved.