Проверка пользователей удаленного Active Directory в C#
Я пытаюсь аутентифицировать пользователей, принадлежащих удаленному ActiveDirectory, с моего компьютера, который не совпадает с доменом текущего компьютера или пользовательского домена. Между моей машиной и удаленной машиной ActiveDirectory не будет доверия.
Начальная попытка
Я попытался аутентифицировать пользователя (входные данные: sAMAccountName, ipaddress машины, имя пользователя домена машины ("Администратор") и пароль машины (***). В результате получился результат, что пользователь с именем "sAMAccountName" существует в ActiveDirectory.
Мое требование:
Представьте, что в ActiveDirectory уже создан пользователь ("qwerty")
Со своей локальной машины у меня будет следующая информация,
а. Удаленный ActiveDirectory IPaddress
б. Имя пользователя и пароль удаленного компьютера ActiveDirectory.
с. Имя пользователя и пароль пользователя "qwerty"
Мне нужно проверить, присутствует ли пользователь "qwerty" в списке пользователей удаленного ActiveDirectory, и проверить, совпадает ли введенный пароль в списке пользователей ActiveDirectory.
Код, который я пробовал:
DirectoryEntry entry = new DirectoryEntry("LDAP://ipaddress/DC=dinesh,DC=com", name, password);
DirectorySearcher searcher = new DirectorySearcher(entry);
searcher.Filter = "(sAMAccountName=" + name + ")";
try
{
SearchResult adsSearchResult = adsSearcher.FindOne();
isValid = true;
adsEntry.Close();
}
catch (Exception ex)
{
adsEntry.Close();
}
Нужно ли создавать доверие между локальным компьютером и удаленным компьютером ActiveDirectory перед проверкой пользователей в удаленном ActiveDirectory? Если да, пожалуйста, расскажите, как это можно сделать;
После создания доверия, как я могу проверить пользователей?
================================================== =========================
Я могу использовать решение, предложенное Райнером, но с новой проблемой. Когда я создаю нового пользователя с помощью кода C# с другого компьютера, некоторые свойства устанавливаются неправильно.
Нужно ли устанавливать это принудительно при создании пользователя?
1 ответ
Сначала некоторые основы (независимо от этого вопроса)
Аутентификация
Система проверяет, действительно ли Боб Боб. В среде Active Directory это обычно делается с помощью доменного имени входа с рабочей станции, Боб вводит свое имя пользователя и пароль, и он получает билет Kerberos. Позже, если он хочет получить доступ, например, к общей папке на удаленном файловом сервере, ему больше не нужно входить в систему, и он может получить доступ к файлам без ввода имени пользователя / пароля.
авторизация
Система проверяет, к каким ресурсам Бобу разрешен доступ. Обычно Боб входит в доменные группы, а группа в ACL (список контроля доступа) ресурса.
Если существует несколько доверяющих доменов, Боб должен войти в один домен и иметь доступ к ресурсам во всех других доменах. Это одна из основных причин использования Active Directory: единый вход
Проверка правильности имени пользователя / пароля
Если у вас есть имя пользователя и пароль, и вы хотите проверить, является ли пароль действительным, вы должны выполнить вход в домен. Невозможно просто "проверить правильность пароля". Вход в систему означает: если существует политика безопасности "заблокировать учетную запись, если более 3 недействительных входов в систему", учетная запись будет заблокирована при проверке с неверным паролем, даже если вы "только хотите проверить пользователя + пароль".
Использование функций службы каталогов.NET
Здесь я предполагаю, что этот процесс либо выполняется учетной записью человека как обычная программа, либо программа является службой Windows или запланированной задачей, которая выполняется под учетной записью "технического пользователя" домена. В этом случае вам не нужно предоставлять учетные данные для использования функций AD. При доступе к другим доверенным доменам AD это также верно. Если вы хотите войти в "чужой домен", и нет доверия, вам нужно указать имя пользователя + пароль (как в вашем коде).
"Ручная" аутентификация пользователя
Обычно это не нужно. Пример: использование интрасети ASP.NET. Пользователь получает доступ к веб-приложению в текущем домене или доверенном домене, проверка подлинности выполняется "в фоновом режиме" браузером и IIS (если включена встроенная проверка подлинности Windows). Таким образом, вам никогда не нужно обрабатывать пароли пользователей в приложении.
Я не вижу много случаев, когда пароль обрабатывается кодом.
Можно предположить, что ваша программа является вспомогательным инструментом для хранения экстренных учетных записей / паролей пользователей. И вы хотите периодически проверять, являются ли эти учетные записи действительными.
Это простой способ проверить:
using System.DirectoryServices.AccountManagement;
...
PrincipalContext principalContext =
new PrincipalContext(ContextType.Domain, "192.168.1.1");
bool userValid = principalContext.ValidateCredentials(name, password);
Можно также использовать более старые, необработанные функции ADSI:
using System.DirectoryServices;
....
bool userOk = false;
string realName = string.Empty;
using (DirectoryEntry directoryEntry =
new DirectoryEntry"LDAP://192.168.1.1/DC=ad,DC=local", name, password))
{
using (DirectorySearcher searcher = new DirectorySearcher(directoryEntry))
{
searcher.Filter = "(samaccountname=" + name + ")";
searcher.PropertiesToLoad.Add("displayname");
SearchResult adsSearchResult = searcher.FindOne();
if (adsSearchResult != null)
{
if (adsSearchResult.Properties["displayname"].Count == 1)
{
realName = (string)adsSearchResult.Properties["displayname"][0];
}
userOk = true;
}
}
}
Если ваше реальное требование на самом деле - проверка правильности user+password, вы можете сделать это одним из следующих способов.
Однако, если это "обычное приложение", которое просто хочет проверить правильность введенных учетных данных, вам следует пересмотреть свою логику. В этом случае вам лучше полагаться на единый знак возможностей AD.
Если есть дополнительные вопросы, пожалуйста, прокомментируйте.
б. Имя пользователя и пароль удаленного компьютера ActiveDirectory.
Это звучит немного неясно. Я предполагаю, что вы имеете в виду "имя пользователя и соответствующий пароль в удаленном домене".
Существует также концепция учетной записи компьютера, которая является именем хоста с добавлением $. Но это другая тема.
Создание нового пользователя
Опция 1
using (DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://192.168.1.1/CN=Users,DC=ad,DC=local",
name, password))
{
using (DirectoryEntry newUser = directoryEntry.Children.Add("CN=CharlesBarker", "user"))
{
newUser.Properties["sAMAccountName"].Value = "CharlesBarker";
newUser.Properties["givenName"].Value = "Charles";
newUser.Properties["sn"].Value = "Barker";
newUser.Properties["displayName"].Value = "CharlesBarker";
newUser.Properties["userPrincipalName"].Value = "CharlesBarker";
newUser.CommitChanges();
}
}
Вариант 2
using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "192.168.1.1",
"CN=Users,DC=ad,DC=local", name, password))
{
using (UserPrincipal userPrincipal = new UserPrincipal(principalContext))
{
userPrincipal.Name = "CharlesBarker";
userPrincipal.SamAccountName = "CharlesBarker";
userPrincipal.GivenName = "Charles";
userPrincipal.Surname = "Barker";
userPrincipal.DisplayName = "CharlesBarker";
userPrincipal.UserPrincipalName = "CharlesBarker";
userPrincipal.Save();
}
}
Я оставляю вам упражнение, чтобы выяснить, какой атрибут входит в какое поле ввода диалога пользователя:-)