Основные приложения и системы .NET.DirectoryServices в контейнере Docker

#docker #.net-core #directoryservices

#docker #.net-core #directoryservices

Вопрос:

Я пытаюсь поместить приложение .NET Core 3.1, в котором перечислены пользователи из группы AD, в контейнер Docker среды выполнения .NET Core. Доступ к AD осуществляется с помощью DirectorySearcher из системы.Пространство имен DirectoryServices. Изначально .NET Core не поддерживает это пространство имен, но добавляет систему пакетов.DirectoryServices (dotnet добавляет систему пакетов.DirectoryServices) установил необходимые сборки, и приложение отлично работает на компьютере с Win10.

Попытка разрешить запуск приложения в контейнере среды выполнения Linux .Net Core вызывает исключение, поскольку DirectoryServices не поддерживает эту платформу.

Итак, я попытался использовать контейнер на базе Windows (если быть точным, тег 3.1.8-nanoserver-2004), но затем FindAll() DirectorySearcher выдает исключение

 System.DllNotFoundException: Unable to load DLL 'activeds.dll' or one of its dependencies: The specified module could not be found. (0x8007007E)
  

Я даже пытался скопировать DLL со своего хост-компьютера в каталог bin приложения в контейнере, но безрезультатно.

У кого-нибудь есть идея, что нужно сделать, чтобы получить доступ к AD / LDAP из контейнера?

Ответ №1:

Поскольку я не мог заставить контейнер Windows Server добавить функцию Active Directory, я решил переключиться на что-то другое и нашел LdapForNet

Хотя это хорошо работает на компьютере разработчика, мне также было трудно найти способ вызвать требуемый Bind () для нашего контроллера домена из контейнера. Но после половины дня проб и ошибок я обнаружил, что LdapAuthType.Negotiate работает, но только в том случае, если я также предоставил область:

 using (var conn = new LdapConnection()){
    conn.Connect(new Uri("LDAP://the.domain.controller"));
    conn.Bind(LdapForNet.Native.Native.LdapAuthType.Negotiate,
        new LdapCredential {
            Realm = "DC=thedomain,DC=com",
            UserName = "The user to authenticate",
            Password = "Plain text password"
        }
    );
}
  

Надеюсь, это поможет другим, пытающимся запустить запросы LDAP внутри контейнера.
Следующая остановка: попытка сделать то же самое внутри контейнера Linux.

Ответ №2:

DirectoryServices в настоящее время не будут работать в Nano Server, поскольку требуемые зависимости недоступны. Вместо этого вам нужно будет использовать образ ядра Windows Server. Для Windows Server Core не доступны официальные образы .NET Core. (По крайней мере, пока. При выпуске .NET 5.0 для него будут доступны образы ядра Windows Server. См. Вопрос GitHub для этого предложения.)

Вам нужно будет определить свой собственный файл Dockerfile, который использует Windows Server Core в качестве базового образа и устанавливает в него .NET Core. Здесь есть руководство о том, как это сделать.

Ссылки по теме:

Комментарии:

1. Отлично, спасибо за ваш быстрый ответ! Я попробую полный базовый образ ядра сервера.

2. После целого дня разочарований я все еще не могу заставить приложение работать внутри контейнера. Похоже, что образ ядра сервера не содержит функции ad-domain-services, и я не могу установить эту функцию, потому что dism и install-windowsfeature не находят исходный файл.

3. Это кажется связанным: serverfault.com/questions/872413 /…