Помощь при устранении неполадок: сбой привязки Active Directory - PullRequest
0 голосов
/ 30 июня 2010

Я пытаюсь диагностировать проблему с серверным приложением, запущенным на сайте клиента.Указанное приложение проверяет подлинность учетных данных пользователя на контроллере домена в среде 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.

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

6/29/2010 14:52:17 PM: Выполнение привязок AD для user1 6/29/ 2010 14:52:17: запуск привязки LDAP к xxx.xxx 29.06.2010 14:52:17: создание объекта DirectoryEntry для домена LDAP: //xxx.xxx 29.06.2010 2:52:17:00: исключение DirectoryServicesCOME во время LDAP. Привязка: ошибка входа в систему: неизвестное имя пользователя или неверный пароль.

6/29/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 \ ветки \\ 2.0_SN_Peer \ Src \ Tools \ Superglue \ ActiveDirectoryHelper.cs: строка 47 29.06.2010 14:52:17: запуск WinNT Привязка к xxx.xxx 29.06.2010 14:52:17: создание объекта DirectoryEntry для user1в домене WinNT: //xxx.xxx 29.06.2010 14:52:18: WinNT Bind Success

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

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

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

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

1 Ответ

0 голосов
/ 01 июля 2010

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

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

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

...