Помощь при устранении неполадок: сбой привязки 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.