Novell LDAP C # - Novell.Directory.Ldap - Кто-нибудь заставил это работать? - PullRequest
9 голосов
/ 22 декабря 2008

Я пытаюсь использовать библиотеку, выпущенную 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;

    // Функция подключения создаст сокетное соединение с сервером

    ldapConn.Connect (ldapHost, LDAPPort);

    // Функция Bind будет привязывать учетные данные объекта пользователя к серверу

    ldapConn.Bind (userDN, userPasswd);

  • В данный момент происходит сбой в функции Bind (). Я получаю ошибку 91.

Итак, кто-нибудь когда-либо использовал эту библиотеку и видел, как она работает? Если да, что вы сделали, чтобы это работало, нужны ли какие-то особые настройки? Есть ли способ заставить его работать в среде .NET без Mono (у меня могут быть ссылки на dll Mono, но я не хочу, чтобы он был установлен на сервере)?

(ДОПОЛНЕНО) Соединение осуществляется через порт 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, поэтому сертификат должен быть получен динамически.

Ответы [ 6 ]

5 голосов
/ 06 декабря 2012

Я искал решение похожей проблемы. Моя команда 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;
        }
3 голосов
/ 14 января 2009

Я наконец нашел способ заставить эту работу.

Во-первых, эти посты помогли мне встать на правильный путь: http://directoryprogramming.net/forums/thread/788.aspx

Во-вторых, я получил скомпилированную DLL-библиотеку Novell LDAP и использовал Mono.Security.Dll.

Решение:

Я добавил эту функцию в код

// This is the Callback handler - after "Binding" this is called
        public bool MySSLHandler(Syscert.X509Certificate certificate, int[] certificateErrors)
        {

            X509Store store = null;
            X509Stores stores = X509StoreManager.LocalMachine;
            store = stores.TrustedRoot;

            //Import the details of the certificate from the server.

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

            //List the details of the Server

            //if (bindCount == 1)
            //{

            Response.Write("<b><u>CERTIFICATE DETAILS:</b></u> <br>");
            Response.Write("  Self Signed = " + x509.IsSelfSigned + "  X.509  version=" + x509.Version + "<br>");
            Response.Write("  Serial Number: " + CryptoConvert.ToHex(x509.SerialNumber) + "<br>");
            Response.Write("  Issuer Name:   " + x509.IssuerName.ToString() + "<br>");
            Response.Write("  Subject Name:  " + x509.SubjectName.ToString() + "<br>");
            Response.Write("  Valid From:    " + x509.ValidFrom.ToString() + "<br>");
            Response.Write("  Valid Until:   " + x509.ValidUntil.ToString() + "<br>");
            Response.Write("  Unique Hash:   " + CryptoConvert.ToHex(x509.Hash).ToString() + "<br>");
            // }

            bHowToProceed = true;
            if (bHowToProceed == true)
            {
                //Add the certificate to the store. This is \Documents and Settings\program data\.mono. . .
                if (x509 != null)
                    coll.Add(x509);
                store.Import(x509);
                if (bindCount == 1)
                    removeFlag = true;
            }

            if (bHowToProceed == false)
            {
                //Remove the certificate added from the store.

                if (removeFlag == true && bindCount > 1)
                {
                    foreach (X509Certificate xt509 in store.Certificates)
                    {
                        if (CryptoConvert.ToHex(xt509.Hash) == CryptoConvert.ToHex(x509.Hash))
                        {
                            store.Remove(x509);
                        }
                    }
                }
                Response.Write("SSL Bind Failed.");
            }
            return bHowToProceed;
        }

И я использовал это в процессе привязки

// Create Connection
                LdapConnection conn = new LdapConnection();
                conn.SecureSocketLayer = true;
                Response.Write("Connecting to:" + ldapHost);

                conn.UserDefinedServerCertValidationDelegate += new
                    CertificateValidationCallback(MySSLHandler);

                if (bHowToProceed == false)
                    conn.Disconnect();
                if (bHowToProceed == true)
                {
                    conn.Connect(ldapHost, ldapPort);
                    conn.Bind(loginDN, password);
                    Response.Write(" SSL Bind Successfull ");

                    conn.Disconnect();
                }
                quit = false;

Ключевые элементы используют обработчик SSL для динамического получения сертификата и используют X509StoreManager.LocalMachine, чтобы при работе веб-сайта можно было сохранять и извлекать сертификаты.

2 голосов
/ 26 сентября 2013

Я работаю над интеграцией Forefront Identity Manager. Поэтому код, который я пишу, всегда исходит от нескольких вызывающих клиентов. Это может не подходить, если вы пытаетесь упаковать приложение для использования «где угодно».

Я просто хотел обновить эту ветку простым решением для серверов Novell, у которых включена опция «требуется конфиденциальность» по умолчанию TLS / SSL.

1) Убедитесь, что вы получаете SSL-сертификаты с сервера Novell, с которым вы также связываетесь, и регистрируете их в доверенном хранилище на исполняющем клиент / сервере. Обычно есть два 1 для 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();
2 голосов
/ 22 декабря 2008

Я думаю, что, возможно, уже предложил этот ответ кому-то еще в другом вопросе.

[OtherQuestion по LDAP] [1]

Я думаю, что есть две проблемы: 1) Какую связь вы пытаетесь сделать? SSL? Очистить текст? Anonymous

2) Как он настроен на стороне eDirectory для привязок LDAP?

Инструмент LDAP Browser, вы ссылаетесь на этот по этой ссылке? Бесплатный браузер LDAP

На стороне eDirectory им может потребоваться TLS для всех соединений LDAP, и они могут запретить анонимные привязки.

Можете ли вы попросить людей на другом конце включить трассировку LDAP (Использование DStrace с включенной опцией + LDAP, некоторые ссылки на то, как использовать Dstrace в Novell eDirectory, смотрите: Различные типы захвата Dstrace и понимание DS Trace для идентификации менеджер.)

Это обычно показывает сообщение об ошибке, которое вас просветит.

Я полагаю, что параметр Require TLS включен, и вы, возможно, не выполняете привязку SSL.

Если это так, попробуйте подключиться к порту 636 с включенным протоколом SSL и полностью определенным DN для пользователя, под которым вы пытаетесь войти.

Если вы пытаетесь включить SSL и у вас не появляется всплывающее окно о принятии доверенного корневого сертификата ЦС дерева, то, возможно, ЦС или сертификат SSL о том, что сервер eDirectory является пользователем, устарел или поврежден. (Для этого может быть много причин, которые могут быть общими и требовать лишь мгновения).

Обычно в Dstrace вы видите ошибку о сертификате SSL, если есть проблема. Пример с точки зрения Novell Identity Manager сертификата с истекшим сроком действия находится в этой статье: Сертификат истек, а также некоторые подробности о том, как исправить сертификаты.

Следующая возможность состоит в том, что указанное вами DN не совсем корректно.

Дайте мне знать, если вам нужна дополнительная помощь.

2 голосов
/ 22 декабря 2008

91 означает «не удается подключиться». Попробуйте перевести сервер в формат «ldap: //x.x.x.x», проверьте, правильно ли задан userDN (с доменом и т. Д.).

Я часто использую WireShark , чтобы увидеть, что происходит на сетевом уровне (он знает о протоколе LDAP).

1 голос
/ 23 декабря 2008

После моего предыдущего поста - если вам нужно использовать безопасное соединение, попробуйте использовать ldaps: // в качестве префикса к адресу сервера.

Если поддержка SSL / TLS отсутствует, вы можете попробовать this - рекомендации и оболочку .NET для библиотеки OpenLDAP.

Один важный момент - в OpenLDAP есть настройки уровня безопасности TLS, поэтому, если ваш LDAP-сервер имеет самозаверяющий сертификат, вы должны либо импортировать его на стороне клиента, либо настроить TLS, чтобы не проверять права подписи *, что меньше безопасно конечно).

...