如何使用MVC 5连接到本地ldap服务器

时间:2016-06-17 19:07:20

标签: c# asp.net-mvc ldap

我正在尝试连接到我使用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服务器,但我不知道为什么。

我非常感谢任何帮助。

更新:凭据无效异常

Apache Directory Studio

用作用户名的字符串:

"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"

1 个答案:

答案 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);
}