过去几个小时我一直被烦人的 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 上的工作?),它也会返回错误。
终于!
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
不包含自定义证书验证的方法。
感谢大家的帮助和时间,希望这对将来的人有帮助!
取决于您的目录服务器(或网络上的元素的配置方式),有时像这样的简单更改会起作用(LDAP 与 LDAPS,但保留端口号)
entry.Path = "LDAP://some.ldap.server:636";
据我记得这个错误意味着目录路径名有问题。
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();
对我来说,启动和停止相应的 IIS 网站解决了问题。
对我来说,以下配置有效:
LDAP://some.ldap.server:636
。注1:
LDAP
中的字母全部大写。小写字母 ldap
不起作用。
注2:
LDAP
,不是LDAPS
。 LDAPS
没用。
注3:端口
636
。
AuthenticationTypes.SecureSocketsLayer
。