Помощь при устранении неполадок: сбой привязки Active Directory

Я пытаюсь диагностировать проблему с серверным приложением, запущенным на сайте клиента. Указанное приложение проверяет подлинность учетных данных пользователя на контроллере домена в среде AD. Поведение, которое мы наблюдаем, заключается в том, что периодически пользователи не могут проходить аутентификацию через сервер.

По сути, мы проследили, что провал "провалился". Для дальнейшей диагностики проблемы я создал очень простой инструмент, который выполняет два типа привязок: один использует привязку к серверу LDAP, а другой использует привязку WinNT. Наше серверное приложение выполняет только привязку LDAP, но для добавления элемента управления я добавил привязку WinNT.

        public static void DoWinNTBind(string domain, string login, string password)
        {
            Logger.Log("Starting WinNT Bind to {0}",domain);
            try
            {
                var serverPath = String.Format("WinNT://{0}",domain);

                Logger.Log("Creating DirectoryEntry object for {0} on domain {1}", login, serverPath);
                using (DirectoryEntry de = new DirectoryEntry(serverPath, login, password, AuthenticationTypes.Secure | AuthenticationTypes.Sealing))
                {

                    if (!de.NativeObject.Equals(null))
                    {
                        Logger.Log("WinNT Bind Success");
                    }
                    else
                    {
                        Logger.Log("WinNT Bind Failed");
                    }
                }
            }
            catch(Exception ex)
            {
                Logger.Log("{0} occured during WinNT Bind: {1}",ex.GetType().Name,ex.Message);
                Logger.Log("Stack: {0}",ex.StackTrace);
            }
        }

        public static void DoLDAPBind(string domain,string login, string password) 
        {
            Logger.Log("Starting LDAP Bind to {0}",domain);
            try
            {
                var serverPath = String.Format("LDAP://{0}",domain);

                Logger.Log("Creating DirectoryEntry object for {0} on domain {1}", login, serverPath);
                using (DirectoryEntry de = new DirectoryEntry(serverPath, login, password, AuthenticationTypes.Secure | AuthenticationTypes.Sealing))
                {

                    if (!de.NativeObject.Equals(null))
                    {
                        Logger.Log("LDAP Bind Success");
                    }
                    else
                    {
                        Logger.Log("LDAP Bind Failed");
                    }
                }
            }
            catch(Exception ex)
            {
                Logger.Log("{0} occured during LDAP Bind: {1}",ex.GetType().Name,ex.Message);
                Logger.Log("Stack: {0}",ex.StackTrace);
            }
        }

Как вы можете видеть, существует не так много кода, кроме использования System.DirectoryServices.DirectoryEntry для подключения к DC.

В результате получается лог-файл (имя и домен замаскированы).

29.06.2010 14:52:17: выполнение привязок AD для user1 29.06.2010 14:52:17: запуск привязки LDAP к xxx.xxx 29.06.2010 14:52:17: создание DirectoryEntry объект для домена LDAP://xxx.xxx 29.06.2010 14:52:17: во время LDAP возникла исключительная ситуация DirectoryServicesCOMEx: ошибка входа: неизвестное имя пользователя или неверный пароль.

29.06.2010 14:52:17: Стек: в System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) в System.DirectoryServices.DirectoryEntry.Bind() в System.DirectoryServices.DirectoryEntry.get_NativeObject() в AdmitOne.Superglue.ActiveDirectoryHelper.DoLDAPBind(Строковый домен, Строковый вход, Строковый пароль) в C:\Projects\Galapagos\branch \Contract\2.0_SN_Peer\Src\Tools\Superglue\ActiveDirectoryHelper.cs: строка 47 29.06.2010 2:52:17:00: запуск привязки WinNT к xxx.xxx 29.06.2010 14:52:17: создание объекта DirectoryEntry для user1 в домене WinNT://xxx.xxx 29.06.2010 14:52:18: привязка WinNT успех

Таким образом, одно и то же имя пользователя не может быть привязано с помощью LDAP, но успешно работает с WinNT!

Локально в нашей тестовой среде мы не видим такого поведения, и LDAP, и WinNT успешно работают без проблем.

Так что я застрял. Я хотел бы сказать, что это проблема с их средой AD, но без курящего пистолета я не могу.

Сначала я спрашиваю в стеке, чтобы убедиться, что мой код привязки правильный. После этого мне, вероятно, понадобится повторно обратиться к Serverfault, который является более подходящим местом для решения проблем, связанных с AD.

1 ответ

Решение

Оказывается, это не проблема кода, но вместо этого в среде AD клиента возникают проблемы с Kerberos.

В частности, флаги Secure/Sealing предписывают провайдеру LDAP использовать только Kerberos для безопасного согласования аутентификации.

Поскольку Kerberos не поддерживается провайдером WinNT, нет проблем с привязкой провайдера WinNT.

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