我一直在攻击.Net 3.5 PrincipalContext,尝试建立与OpenLDAP的连接,该连接与我的Visual Studio 2010 IDE安装在同一台机器上(机器名为dev001)。
这是我简单的LDAP结构:
以下是我尝试过的代码段:
Snippet#1 :名称组合:“localhost”,“localhost:389”,“dev001”,“dev001:389”,“test”,“test.com”
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "localhost", "dc=accounts,dc=test,dc=com", "cn=testadmin,dc=test,dc=com", "testadminpassword");
Snippet#2 名称组合:“localhost”,“localhost:389”,“dev001”,“dev001:389”,“test”,“test.com”
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "localhost", "dc=accounts,dc=test,dc=com", "testadmin", "testadminpassword");
我还没有与服务器建立连接。
当我使用“localhost”,“localhost:389”,“dev001”,“dev001:389”或“test”时,我收到错误:
System.NullReferenceException:未将对象引用设置为对象的实例。
当我使用“test.com”时,我收到错误:
System.DirectoryServices.AccountManagement.PrincipalServerDownException:无法联系服务器。 ---> System.DirectoryServices.Protocols.LdapException:LDAP服务器不可用。
答案 0 :(得分:0)
您的第一个问题是使用System.DirectoryServices命名空间。那里的类只适用于Active Directory。我很久以前就把它放在System.DirectoryServices.Protocols命名空间以及大多数其他人身上。这里有一些代码可以帮助您开始连接。
var host = "localhost:389";
var credential = new NetworkCredential("user", "secret");
using (var con = new LdapConnection(host) { Credential = credential, AuthType = AuthType.Basic, AutoBind = false })
{
con.SessionOptions.ProtocolVersion = 3;
con.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback(VerifyCertDelegate);
//con.SessionOptions.StartTransportLayerSecurity(new DirectoryControlCollection());
con.Bind()
//Do other ldap operations here such as setting the user password
var pass = "newpass";
var req = new ModifyRequest
{
DistinguishedName = "cn=user,ou=test,dc=example,dc=com"
};
var dam = new DirectoryAttributeModification
{
Name = "userPassword",
Operation = DirectoryAttributeOperation.Replace
};
dam.Add(pass);
req.Modifications.Add(dam);
con.SendRequest(req);
}
请注意,上面的TLS已关闭。如果你想要一个安全的连接,请在端口636上使用ssl。微软ldap库有一个竞争条件,当你在网络服务器环境中进行两次同时的ldap调用时,会导致你的cpu在无限循环中出现峰值。