Как сохранить мое приложение «аутентифицированным» с помощью учетной записи AD? c# - PullRequest
0 голосов
/ 12 марта 2020

Я довольно новичок в C#
Я использую скрипты Powershell для кодирования таких вещей, как разблокировка пользователя AD или включение / отключение учетной записи. однако я делаю это с другой учетной записью, поэтому я войду в систему с учетной записью администратора (Get-Credential) и сохраню ее, например, как «$ cred».

В настоящее время я пытаюсь сделать аналогичную вещь в C#, и я нашел, как эффективно выполнить «Аутентификацию», но я не уверен, как сохранить эту Аутентификацию, или чтобы Аутентификация моего приложения выполнялась с ней например, «Отключить или разблокировать учетную запись AD».

У меня есть следующее:

public bool ADauthenticate(string username, string password)
{
    bool result = false;
    using (DirectoryEntry _entry = new DirectoryEntry())
    {
        _entry.Username = username;
        _entry.Password = password;
        DirectorySearcher _searcher = new DirectorySearcher(_entry);
        _searcher.Filter = "(objectclass=user)";
        try
        {
            SearchResult _sr = _searcher.FindOne();
            string _name = _sr.Properties["displayname"][0].ToString();
            MessageBox.Show("authenticated!");
            result = true;
            this.Close();
        }
        catch
        {
            MessageBox.Show("Incorrect credentials");
            this.ADUsername.Text = "";
            this.ADPwd.Text = "";
        }
    }
    return result; //true = user Authenticated.
}

Что, разумеется, говорит о правильности учетной записи, но не сохраняет мое приложение «аутентифицированным», есть идеи?

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Неверно утверждать, что ваше «приложение» было аутентифицировано. Все, что было аутентифицировано, это одно сетевое соединение с вашим контроллером домена. Как только _entry уничтожено, вы теряете эту аутентификацию.

Если вы хотите, чтобы все происходило с использованием этих учетных данных, тогда у вас есть несколько вариантов, от простого (для вас) до более сложного:

  1. Пусть ваши пользователи запускают ваше приложение с нужными им учетными данными. Тогда вам не нужно беспокоиться о получении их имени пользователя и пароля или установке имени пользователя и пароля для объекта DirectoryEntry. Пользователи могут сделать это:

    • С помощью Shift + щелкните правой кнопкой мыши значок приложения и выберите «Запуск от имени другого пользователя», или
    • Создайте ярлык для: runas.exe /user:DOMAIN\username "yourapplication.exe" , Откроется командное окно с запросом пароля, а затем запустите ваше приложение с такими учетными данными.
  2. Вы по-прежнему запрашиваете имя пользователя и пароль, но перезапустите свое приложение под этими учетными данными. используя Process.Start().

  3. Поддерживайте переменные username и password в течение всего жизненного цикла приложения и передавайте их каждому DirectoryEntry объекту, который вы создайте в своем приложении.

Параметры 1 и 2 требуют, чтобы компьютер, с которого вы его запускаете, был подключен к тому же или доверенному домену, что и домен, к которому вы подключаетесь. Но так как я вижу, что вы не указываете доменное имя, я предполагаю, что это так.

0 голосов
/ 12 марта 2020

Вы можете сделать это намного проще, используя сборку System.DirectoryServices.AccountManagement и пространство имен.

Добавьте ссылку на сборку System.DirectoryServices.AccountManagement в свой проект, а затем используйте этот код для проверки имени пользователя / пароля по AD:

using System.DirectoryServices.AccountManagement;

// create the principal context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YourDomain"))
{
    bool accountValidated = ctx.ValidateCredentials(userName, password);

    // do whatever you want to do with this information
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...