我正在尝试连接到我使用Apache Directory Studio设置的本地LDAP服务器。我正在使用Visual Studio 2015企业更新2和MVC 5。
这是我正在使用的两种方法:
public void ldap()
{
try
{
DirectoryEntry entry = new DirectoryEntry("LDAP://localhost:10389");
DirectorySearcher mySearcher = new DirectorySearcher(entry);
var result = mySearcher.FindOne();
}
catch (System.Runtime.InteropServices.COMException)
{
System.Runtime.InteropServices.COMException exception = new System.Runtime.InteropServices.COMException();
Console.WriteLine(exception);
}
catch (InvalidOperationException)
{
InvalidOperationException InvOpEx = new InvalidOperationException();
Console.WriteLine(InvOpEx.Message);
}
catch (NotSupportedException)
{
NotSupportedException NotSuppEx = new NotSupportedException();
Console.WriteLine(NotSuppEx.Message);
}
}
执行var result = mySearcher.FindOne()之后,System.DirectoryServices.dll中出现System.Runtime.InteropServices.COMException',表示在调用COM-Component时传递了HRESULT E_FAIL错误。
我不知道这意味着什么,也没有找到使用谷歌有用的东西。
第二种方法:
try
{
LdapConnection ldapConnection = new LdapConnection("LDAP://localhost:10389");
var networkCredential = new NetworkCredential("cbrunato", "c2VjcmV0", "dc=example,dc=com");
ldapConnection.SessionOptions.SecureSocketLayer = true;
ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; };
ldapConnection.AuthType = AuthType.Negotiate;
ldapConnection.Bind(networkCredential);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
执行ldapConnection.Bind(networkCredential)后,我收到错误消息“LDAP服务器不可用”。
当我停止ldap服务器并运行程序时,我得到了相同的错误,所以我想我没有使用这两种方法连接到我的ldap服务器,但我不知道为什么。
我非常感谢任何帮助。
更新:凭据无效异常
用作用户名的字符串:
"uid=cbrunato"
"cn=Chuck Brunato"
"cn=Chuck Brunato,ou=Users,dc=example,dc=com"
"uid=cbrunato,cn=Chuck Brunato,ou=Users,dc=example,dc=com"
"uid=cbrunato,ou=Users,dc=example,dc=com"
答案 0 :(得分:0)
您在使用LdapConnection
时遇到了一些问题。
首先,您需要设置LdapProtocol版本,其次,您需要进行基本身份验证。 “协商”选项最常用于Microsoft产品。当您使用端口10389时,您不需要SSL,因为10636是SSL端口。
此代码适用于我:
try
{
// don't add LDAP://, the protocol is already known ...
LdapConnection ldapConnection = new LdapConnection("127.0.0.1:10389");
// notice we don't use the domain here
var networkCredential = new NetworkCredential(
"uid=yourusername,dc=example,dc=com",
"yourpassword");
// Apache Directory Server uses LDAPv3
ldapConnection.SessionOptions.ProtocolVersion = 3;
// 10389 is the plain port, no ssl needed
//ldapConnection.SessionOptions.SecureSocketLayer = true;
// ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; };
// let's not negotiate, only Basic is supported
ldapConnection.AuthType = AuthType.Basic;
ldapConnection.Bind(networkCredential);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}