[c#] Novell LDAP C# - Novell.Directory.Ldap - 有没有人使它的工作?


Answers

我来找一个类似的问题的解决方案。 在使用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;
        }
Question

我正在尝试使用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 = new LdapConnection(); ldapConn.SecureSocketLayer = ldapPort == 636;

    // Connect函数将创建一个到服务器的套接字连接

    ldapConn.Connect(ldapHost,ldapPort);

    //绑定函数将用户对象证书绑定到服务器

    ldapConn.Bind(用户DN,userPasswd);

  • 现在它在Bind()函数中崩溃了。 我得到错误91。

那么,有人曾经使用这个库,看到它的工作? 如果是这样,你做了什么工作,是否有一些特殊的配置需要? 有没有办法让它在没有单声道的.NET环境中工作(我可以引用单声道的DLL,但我不希望它被安装在服务器上)?

(更新)连接在端口636,因此使用SSL。 我用WireShark检查了通信,并与从LDAP浏览器获得的结果进行了比较。 我已经看到SSL证书传递的步骤不是由LDAP库完成的。 那么,最好的办法是做它应该做的事情?

(更新)我检查了文档,它表明它不支持SSL。 http://www.novell.com/coolsolutions/feature/11204.html

使用LdapConnection.Bind()对LDAP服务器进行身份验证。 我们只支持明文身份验证。 SSL / TLS支持尚未添加。

但是从2004年开始,文件日期已经有了很多更新。 并且在库中有一个参数来定义连接是否使用SSL。 所以现在我很困惑。

(更新)找到一个更新的文档: http : //developer.novell.com/documentation//ldapcsharp/index.html?page=/ documentation //ldapcsharp/cnet/data/bqwa5p0.html 。 SSL连接的方式是在服务器上注册证书。 问题是,我正在做什么没有绑定到特定的Novell服务器,所以证书必须动态获得。




我想我可能已经把这个答案提供给另外一个问题的其他人。

[LDAP上的其他问题] [1]

我认为两个问题:1)你想要做什么样的绑定? SSL? 清除文字? 匿名?

2)如何在eDirectory端配置LDAP绑定?

工具LDAP浏览器,你指的是这个链接? 免费的LDAP浏览器

在eDirectory方面,他们可以要求TLS进行所有LDAP通信,并且可以禁止匿名绑定。

您可以请求另一端的人员启用LDAP跟踪(在启用了+ LDAP选项的情况下使用DStrace,有关如何在Novell eDirectory上使用Dstrace的链接,请参阅:不同类型的Dstrace捕获和了解Identity Manager的DS Trace。

这通常会显示一个错误消息,将启发你。

我的猜测是要求TLS已启用,并且您可能不会成功进行SSL绑定。

如果是这样,请尝试在启用了SSL的端口636上连接,并为您尝试登录的用户提供完全限定的DN。

如果您尝试启用SSL,并且未收到有关接受树CA受信任根证书的弹出框,则可能CA或eDirectory服务器的SSL证书是用户已过期或已损坏。 (有这么多的原因可以是常见的,但需要一些时间来解决)。

通常在Dstrace中,如果出现问题,您将看到有关SSL证书的错误。 Novell Identity Manager透视过期证书的一个示例在本文中:证书过期以及有关如何修复证书的一些详细信息。

下一个可能性是你指定的DN不太正确。

让我知道如果你需要更多的帮助。




我从事Forefront Identity Manager集成工作。 所以我写的代码总是来自几个呼叫客户端。 如果您试图将应用程序打包为“随处可用”,这可能不合适。

我只是想用一个简单的解决方案来更新这个线程,Novell服务器的默认TLS / SSL“机密性要求”选项启用。

1)确保从绑定的Novell服务器上获得SSL证书,并将其注册到正在执行的客户端/服务器上的可信存储中。 通常有两个IP和主机名取决于您将调用(DNS优先)

2)使用System.DirectoryServices导入以下/添加引用; 使用System.DirectoryServices.Protocols;

3)这是一个片段。 确保你选择了关键的AuthenticationTypes.SecureSocketsLayer。

// serverAddress = Server IP or DNS (Match SSL certificate)
// ObjectDN = The DN of the user you are binding to
// userName = Account which will be used to make the bind
// password = password of the user which will make the bind
// value = The value you wish to add to the attribute

// Connect to the user in LDAP
DirectoryEntry entry = new DirectoryEntry("LDAP://" + serverAddress + "/" + ObjectDN + ""
                , userName
                , password
                , AuthenticationTypes.SecureSocketsLayer);
// Write the Updated attribute
entry.Properties["attribute"].Value = value;
// Read back the updated Attribute into a label
label.Text = entry.Properties["attribute"].Value.ToString();





Links