Проверка пользователей удаленного Active Directory в C#

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

Начальная попытка

Я попытался аутентифицировать пользователя (входные данные: sAMAccountName, ipaddress машины, имя пользователя домена машины ("Администратор") и пароль машины (***). В результате получился результат, что пользователь с именем "sAMAccountName" существует в ActiveDirectory.

Мое требование:

  1. Представьте, что в ActiveDirectory уже создан пользователь ("qwerty")

  2. Со своей локальной машины у меня будет следующая информация,

    а. Удаленный ActiveDirectory IPaddress

    б. Имя пользователя и пароль удаленного компьютера ActiveDirectory.

    с. Имя пользователя и пароль пользователя "qwerty"

  3. Мне нужно проверить, присутствует ли пользователь "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();
    }
}

Я оставляю вам упражнение, чтобы выяснить, какой атрибут входит в какое поле ввода диалога пользователя:-)

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