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