我正在尝试使用Novell发布的库(novell.directory.ldap)。版本2.1.10。
到目前为止我所做的:
我测试了与应用程序(LdapBrowser)的连接,它正在工作,所以这不是通信问题。
它是用mono编译的,但我正在使用visual studio。所以创建了一个包含源代码的项目。我还引用了mono.security,因为项目依赖于它。
我在连接的错误捕获部分评论了一个调用(freewritesemaphore(semid);),因为它抛出了更多异常。我检查了那个调用做了什么,它只是一个错误跟踪机制。
我遵循了novell(http://www.novell.com/coolsolutions/feature/11204.html)文档中提供的基本步骤。
//创建ldapconnection实例
ldapconnection ldapconn=新建ldapconnection();
ldapconn.securesocketlayer=ldapport==636;
//connect函数将创建到服务器的套接字连接
ldapconn.connect(ldaphost,ldapport);
//bind函数将用户对象凭据绑定到服务器
ldapconn.bind(userdn,userpasswd);
现在它在bind()函数处崩溃。我得到错误91。
那么,有没有人用过这个图书馆,并看到它的工作?如果是的话,你做了什么使它工作,是否需要一些特殊的配置?有没有办法让它在没有mono的.net环境下工作(我可以引用mono dll,但我不希望它安装在服务器上)?
(更新)
连接在端口636上,因此使用ssl。我用wireshark检查了通信,并与从ldap浏览器获得的结果进行了比较。我已经看到,ssl证书传递的步骤不是由ldap库完成的。那么,让它做它该做的事的最佳方法是什么?
(更新)我查看了文档,它表明它不支持ssl。http://www.novell.com/coolsolutions/feature/11204.html
使用对LDAP服务器进行身份验证
ldapconnection.bind()。我们只支持
明文认证。SSL/TLS
支持尚待增加。
但这份文件的日期是2004年,从那以后,许多更新已经作出。库中有一个参数用于定义连接是否使用ssl。所以现在我很困惑。
(更新)找到了更新的文档:http://developer.novell.com/documentation//ldapcsharp/index.html?page=/documentation//ldapcsharp/cnet/data/bqwa5p0.html。建立ssl连接的方式是在服务器上注册证书。问题是,我所做的工作没有绑定到特定的novell服务器,因此必须动态获取证书。

最佳答案

我来找一个解决类似问题的办法。我的bind命令在使用novell网站的相同代码时也会失败。为我工作的解决方案是添加动态证书验证回调。你可以读到它。

        // Creating an LdapConnection instance
        LdapConnection ldapConn = new LdapConnection();

        ldapConn.SecureSocketLayer = true;

        ldapConn.UserDefinedServerCertValidationDelegate += new
                CertificateValidationCallback(MySSLHandler);


        //Connect function will create a socket connection to the server
        ldapConn.Connect(ldapHost, ldapPort);

        //Bind function will Bind the user object Credentials to the Server
        ldapConn.Bind(userDN, userPasswd);

        // Searches in the Marketing container and return all child entries just below this
        //container i.e. Single level search
        LdapSearchResults lsc = ldapConn.Search("ou=users,o=uga",
                           LdapConnection.SCOPE_SUB,
                           "objectClass=*",
                           null,
                           false);

        while (lsc.hasMore())
        {
            LdapEntry nextEntry = null;
            try
            {
                nextEntry = lsc.next();
            }
            catch (LdapException e)
            {
                Console.WriteLine("Error: " + e.LdapErrorMessage);
                // Exception is thrown, go for next entry
                continue;
            }
            Console.WriteLine("\n" + nextEntry.DN);
            LdapAttributeSet attributeSet = nextEntry.getAttributeSet();
            System.Collections.IEnumerator ienum = attributeSet.GetEnumerator();
            while (ienum.MoveNext())
            {
                LdapAttribute attribute = (LdapAttribute)ienum.Current;
                string attributeName = attribute.Name;
                string attributeVal = attribute.StringValue;
                Console.WriteLine(attributeName + "value:" + attributeVal);
            }
        }
        ldapConn.Disconnect();
        Console.ReadKey();
    }

public static bool MySSLHandler(Syscert.X509Certificate certificate,
            int[] certificateErrors)
        {

            X509Store store = null;
            X509Stores stores = X509StoreManager.CurrentUser;
            //string input;
            store = stores.TrustedRoot;

            X509Certificate x509 = null;
            X509CertificateCollection coll = new X509CertificateCollection();
            byte[] data = certificate.GetRawCertData();
            if (data != null)
                x509 = new X509Certificate(data);

            return true;
        }

08-26 19:15