Соединение 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
- Я предлагаю вам сначала привязаться к базе данных как пользователь с правами, которые вам нужны для поиска или анонимно (если анонимный пользователь может выполнять поиск), и выполнить поиск (&(cn=USERNAME)(objectclass=Person)), чтобы найти нужный вам dn. связать как.
- Теперь привяжите пользователя dn, которого вы нашли, с помощью предоставленных учетных данных и получите атрибут groupMembership.
- Изучите атрибут 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
Подключение к LDAP из C# с использованием DirectoryServices
https://forums.novell.com/showthread.php/491292-Is-user-member-of-group-in-C
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 на их сервере.