Как выполнить постраничный поиск на сервере Ldap, используя элемент управления Novell.Directory.Ldap.NETStandard и Simple Paged Results? - PullRequest
1 голос
/ 20 октября 2019

Я пытаюсь выполнить постраничный поиск в Active Directory, используя Novell.Directory.Ldap.NETStandard (https://github.com/dsbenghe/Novell.Directory.Ldap.NETStandard) и элемент управления Simple Paged Results (https://ldapwiki.com/wiki/Simple%20Paged%20Results%20Control).

Первыйстраница работает нормально, но вторая выдает «Недоступное критическое расширение» в строке searchResult.next (). При поиске в журнале событий ActiveDirectory я обнаружил:

00000057: LdapErr: DSID-0C090809, комментарий: ошибкауправление обработкой, данные 0, v23f0 0000208D: NameErr: DSID-03100213, проблема 2001 (NO_OBJECT), данные 0, наилучшее совпадение:

Мы также пробовали LdapVirtualListControl, но столкнулись с другой проблемой, см. Как выполнить постраничный поиск на сервере Ldap с> 10000 записей, используя Novell.Directory.Ldap.NETStandard?

Вот упрощенный код, который мы используем для воспроизведения:

        // Connection
        var ldapConn = new LdapConnection()
        {
            SecureSocketLayer = true,
        };
        ldapConn.UserDefinedServerCertValidationDelegate += (sender, certificate, chain, sslPolicyErrors) => true;
        ldapConn.Connect(host, 636);
        ldapConn.Bind(username, password);

        // Constraints
        LdapSearchConstraints searchConstraints = (LdapSearchConstraints)_conn.SearchConstraints.Clone();
        int pageSize = 100, count = 0;
        bool exit = false;
        const string LDAP_SERVER_SIMPLE_PAGED_RESULT_OID = "1.2.840.113556.1.4.319";

        LdapControl pageControl = null;

        do
        {
            int inPageCount = 0;

            // Add Simple Paged Result control
            var request = new Asn1Sequence(2);
            request.add(new Asn1Integer(pageSize));
            request.add(pageControl == null ? new Asn1OctetString("") : new Asn1OctetString(pageControl.getValue()));
            searchConstraints.setControls(
                new LdapControl(LDAP_SERVER_SIMPLE_PAGED_RESULT_OID, true, request.getEncoding(new LBEREncoder()))
            );

            // Get search result
            var searchResult = (LdapSearchResults)ldapConn.Search(container, LdapConnection.SCOPE_SUB, query, null, false, searchConstraints);
            while (searchResult.hasMore())
            {

                // Detect simple paged result control
                pageControl = searchResult.ResponseControls?.Where(rc => rc.ID == LDAP_SERVER_SIMPLE_PAGED_RESULT_OID).FirstOrDefault();
                if (pageControl != null) break;

                var nextEntry = searchResult.next();
                inPageCount++;

            }
            count += inPageCount;

            // Exit if no more pages
            exit = pageControl == null;

        } while (!exit);
...