Соединение LDAP с IP-адресом и номером порта

Компания, в которой я работаю, имеет продукт, который использует Active Directory для включения функций безопасности нашего продукта, используя библиотеку, которая включает компоненты DirectoryEntry и DirectorySearcher.

Если кто-то является членом группы FOO, они имеют стандартный доступ. Если они являются членами FOO-ADMINУ них есть права администратора.

У нас есть потенциальный клиент, который не использует Active Directory. У них есть сервер Apache, на котором работает LDAP, и они предоставили этот снимок экрана.

Свойства клиента

Выше, похоже, мне нужно было бы подключиться к домену xxx.xxx.5.101:389 (т.е. DirectoryEntry ("LDAP: //xxx.xxx.5.101: 389")), но как это "DN или пользователь" поле подходит с паролем?

Могут ли компоненты Active Directory выполнять проверку подлинности LDAP в системе Apache или код должен иметь совершенно разные элементы управления?

Вот некоторый грубый код, который я собрал:

/// <summary>
/// Untested Method
/// </summary>
/// <param name="hostIp">String (EX: xxx.xxx.5.101)</param>
/// <param name="port">Int (EX: 389)</param>
/// <param name="user">String (EX: cn=danibla,ou=sysdata,ou=townhall,o=toh)</param>
/// <param name="password">String - provided password</param>
/// <param name="groupsLike">String (EX: find all groups like FOO)</param>
/// <returns>String[] array of matching membership groups</returns>
public static String[] GetMemberships(String hostIp, int port, String user, String password, String groupsLike)
{
    var results = new List<String>();
    var path = String.Format("LDAP://{0}:{1}", hostIp, port);
    using (var entry = new DirectoryEntry(path, user, password))
    {
        using (var search = new DirectorySearcher(entry, String.Format("(CN={0}*)", groupsLike)))
        {
            var expression = new Regex("CN=([^,]*),", RegexOptions.Compiled & RegexOptions.IgnoreCase);
            foreach (SearchResult item in search.FindAll())
            {
                var match = expression.Match(item.Path);
                var name = match.Groups[1].Value;
                if (name.StartsWith(groupsLike, StringComparison.OrdinalIgnoreCase))
                {
                    if (!results.Contains(name))
                    {
                        results.Add(name);
                    }
                }
            }
        }
    }
    return results.ToArray();
}

Меня беспокоят параметры типа пути, которые они передают для поля "DN или пользователь", особенно когда оно показывает, что они предоставляют пароль.

У нас нет среды Apache для тестирования. Наша компания не хочет, чтобы я шел к этому клиенту с множеством ненужных вопросов.

ОБНОВИТЬ:
Еще нужен способ сделать это. Начиная щедрость. Возможно, привлечение некоторого внимания поможет мне найти решение.

Текущее состояние

На скриншоте выше значение для username в коде было как cn-mikead,ou=sysdata,ou=townhall,o=toh и отдельно mikeadоба с тем же COM-исключением при вызове FindAll(),

Вот код, который у меня есть сейчас.

public static String[] Groups(String domain, int port, String username, int authenticationValue, String startsWith)
{
    String name;
    var results = new List<String>();
    var ldapPath =
        String.IsNullOrEmpty(domain) ? null :
        (0 < port) ?
        String.Format("LDAP://DC={0}:{1}", domain, port) :
        String.Format("LDAP://DC={0}", domain);
    using (var entry = new DirectoryEntry(String.Format("WinNT://{0}/{1}", Environment.UserDomainName, username)))
    {
        name = String.Format("{0}", entry.Properties["fullName"].Value);
    }
    var filter = String.Format("(CN={0}", name);
    var expression = new Regex("CN=([^,]*),", RegexOptions.Compiled & RegexOptions.IgnoreCase);
    using (var entry = new DirectoryEntry(ldapPath))
    {
        entry.AuthenticationType = (AuthenticationTypes)authenticationValue;
        using (var search = new DirectorySearcher(entry) { Filter = filter })
        {
            search.PropertiesToLoad.Add("memberOf");
            try
            {
                foreach (SearchResult item in search.FindAll())
                {
                    foreach (var property in item.Properties["memberOf"])
                    {
                        var name = expression.Match(String.Format("{0}", property)).Groups[1].Value;
                        if (name.StartsWith(startsWith, StringComparison.OrdinalIgnoreCase))
                        {
                            if (!results.Contains(name))
                            {
                                results.Add(name);
                            }
                        }
                    }
                }
            }
            catch (Exception err)
            {
                LogError("Groups", err);
            }
        }
    }
    return results.ToArray();
}

2 ответа

Хотел бы я иметь больше времени, чтобы дать вам более полный ответ. Но позвольте мне посмотреть, поможет ли это вообще. Членство в группах работает в eDirectory по-разному, и атрибут memberOf отсутствует. Вы также можете обнаружить, что вам нужно перейти на более низкий уровень, чем DirectoryEntry, DirectorySearcher и т. Д. (Так как они предназначены для AD). System.DirectoryServices.Protocols предоставит вам более низкий уровень доступа.

Кроме того, Novell также имеет библиотеки C#, которые вы могли бы использовать: https://www.novell.com/developer/ndk/ldap_libraries_for_c_sharp.html

  1. Я предлагаю вам сначала привязаться к базе данных как пользователь с правами, которые вам нужны для поиска или анонимно (если анонимный пользователь может выполнять поиск), и выполнить поиск (&(cn=USERNAME)(objectclass=Person)), чтобы найти нужный вам dn. связать как.
  2. Теперь привяжите пользователя dn, которого вы нашли, с помощью предоставленных учетных данных и получите атрибут groupMembership.
  3. Изучите атрибут groupMembership, чтобы определить свои привилегии.

Если вы не можете заставить работать атрибут groupMembership, вы можете выполнить поиск в каталоге группы: ((cn=GROUPNAME)(objectclass=groupOfNames)) Затем вы можете просмотреть атрибуты groupOfNames:member, чтобы найти ваше имя пользователя.

Я бы начал с попытки привязки / аутентификации, а затем добавил групповой материал. Вот пример привязки здесь: https://www.codeproject.com/Articles/5969/Authentication-against-Active-Directory-and-Edirec

Или альтернативный метод здесь, если у вас есть проблемы с сертификатом: https://www.codeproject.com/Articles/19097/eDirectory-Authentication-using-LdapConnection-and

Вот несколько полезных ссылок:

https://www.mediawiki.org/wiki/Extension:LDAP_Authentication/Examples

https://docs.oracle.com/cd/E36500_01/E36503/html/ldap-filters-attrs-users.html

https://www.ibm.com/support/knowledgecenter/en/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ae/rwlp_config_edirectoryLdapFilterProperties.html

Подключение к LDAP из C# с использованием DirectoryServices

https://forums.novell.com/showthread.php/491292-Is-user-member-of-group-in-C

https://www.novell.com/documentation/developer/ldapcsharp/?page=/documentation/developer/ldapcsharp/cnet/data/bovtz77.html

http://mikemstech.blogspot.com/2013/03/searching-non-microsoft-ldap.html

https://www.sqlservercentral.com/Forums/Topic811694-391-1.aspx

Apache может запускать LDAP, мой совет - убедиться, что ваш клиент правильно настроил LDAP на своем сервере. Это можно сделать в httpd.conf на их сервере.

Другие вопросы по тегам