Аутентификация ADAM с пользователем ADAM и простое связывание

Я следовал пошаговому руководству ADAM от Microsoft и установил экземпляр ADAM на своем локальном компьютере. Я пытаюсь пройти аутентификацию, используя учетную запись "Мэри Бейкер", но каждый раз, когда я получаю исключение COM на if (entry.Guid != null) строка ниже. Исключение гласит, что существует неизвестное имя пользователя или неверный пароль.

Однако я могу использовать утилиту ldp для подключения к ADAM и успешно выполнить простое связывание - поэтому я знаю, что имя пользователя существует, и у меня есть правильный пароль.

Кроме того, я установил для свойства msDS-UserAccountDisabled пользователя значение false и добавил пользователя в роли администраторов и читателей.

Какие-нибудь мысли?

    path = "LDAP://localhost:50000/O=Microsoft,c=US";
    userId = "CN=Mary Baker,OU=ADAM users,";
    password = "Mary@101";

    DirectoryEntry entry = new DirectoryEntry(path, userId, password, AuthenticationTypes.None);
    if (entry.Guid != null)
        LoadWelcomeScreen();

Благодарю.

4 ответа

ADAM хранит уникальный идентификатор пользователя в displayName атрибут user учебный класс. Они должны быть уникальными в экземпляре ADAM для аутентификации пользователя. Если два пользователя оба имели свои displayName Если для атрибута установлено значение "jsmith", то ни один пользователь не сможет пройти аутентификацию в ADAM.

Используйте утилиту ldp для запроса displayName для Мэри Бейкер. Это может быть что-то вроде "mbaker". Используйте это значение в качестве userId в данном коде.

Спасибо Райан за ваш совет на displayName. Разместил мой тестовый класс в моем локальном экземпляре ADAM для всех, кому это может быть интересно.

    [TestMethod]
    public void CreateUserAccount()
    {
        var username = "amurray";
        var password = "ADAMComplexPassword1234";
        var firstname = "Andy";
        var lastname = "Murray";

        const AuthenticationTypes authTypes = AuthenticationTypes.Signing |
                                              AuthenticationTypes.Sealing |
                                              AuthenticationTypes.Secure;

        var ldapPath = "LDAP://localhost:389/OU=MyProject,OU=Applications,DC=Company,DC=ADAM";
        using (var dirEntry = new DirectoryEntry(ldapPath, "MyPC\\adamuser", "Password1!", authTypes))
        {
            DirectoryEntry user = null;
            const int ADS_PORT = 389;
            const long ADS_OPTION_PASSWORD_PORTNUMBER = 6;
            const long ADS_OPTION_PASSWORD_METHOD = 7;
            const int ADS_PASSWORD_ENCODE_CLEAR = 1;

            try
            {
                user = dirEntry.Children.Add(string.Format("CN={0} {1}", firstname, lastname), "user");
                user.Properties["displayName"].Value = username;
                user.Properties["userPrincipalName"].Value = username;
                user.Properties["msDS-UserAccountDisabled"].Value = false;
                user.Properties["msDS-UserDontExpirePassword"].Value = true;
                user.CommitChanges();
                var userid = user.Guid.ToString();

                // Set port number, method, and password.
                user.Invoke("SetOption", new object[]{ADS_OPTION_PASSWORD_PORTNUMBER,ADS_PORT});
                user.Invoke("SetOption", new object[]{ADS_OPTION_PASSWORD_METHOD,ADS_PASSWORD_ENCODE_CLEAR});

                user.Invoke("SetPassword", new object[] {password});
                user.CommitChanges();
                user.Close();
            }
            catch (Exception e)
            {
                var msg = e.GetBaseException().Message;
                Console.WriteLine(e);
                System.Diagnostics.Debug.Print(msg);
            }                
        }
    }


    [TestMethod]
    public void TestUserAuthentication()
    {
        try
        {
            var ldsContext = new PrincipalContext(ContextType.ApplicationDirectory, "localhost:389",
                                                  "OU=MyProject,OU=Applications,DC=Company,DC=ADAM",
                                                  ContextOptions.SimpleBind);

            // Returns true if login details are valid
            var isValid = ldsContext.ValidateCredentials("amurray", "ADAMComplexPassword1234", ContextOptions.SimpleBind);
        }
        catch (Exception e)
        {
            var msg = e.GetBaseException().Message;
            Console.WriteLine(e);
            System.Diagnostics.Debug.Print(msg);
        }
    }

Меня зовут ADAM, и я не одобряю эту аутентификацию.

(лол, извините, пришлось сделать это)

Я не использовал ADAM или System.DirectoryServices, но у меня есть опыт работы с LDAP и AD; надеюсь следующее применимо.

Я никогда не видел идентификатор пользователя, указанный в этом формате, прежде. (Похоже, что-то вроде относительного DN, как указано в конце запятой?) Вы пытались указать идентификатор пользователя в качестве полного DN (как того требует стандарт LDAP) или в виде пустого имени пользователя (если ADAM это поддерживает)?

При диагностике таких проблем с сетевым протоколом (когда я проверяю, выполняет ли моя программа то, что, как мне кажется, я ей говорю, и смотрю, как она сравнивается с тем, что делает работающая программа), я обнаружил, что полезно запустить Wireshark. как для неработающей, так и для работающей операции, чтобы увидеть, как они отличаются. Если вы никогда не использовали Wireshark, надеюсь, вам не составит труда начать:

  1. Загрузите, установите и запустите программное обеспечение.
  2. В разделе "Захват" нажмите "Параметры".
  3. Установите для интерфейса либо localhost / loopback, либо свой интерфейс Ethernet. (Я не думаю, что loopback работает должным образом в Windows; возможно, вы захотите выбрать свой интерфейс Ethernet и обновить URL-адрес LDAP в своем коде C#, чтобы использовать ваше имя хоста, а не localhost.)
  4. Под Фильтром захвата введите "TCP-порт 50000" (без кавычек).
  5. Нажмите "Пуск", запустите операцию подключения, затем перейдите в меню "Захват" и нажмите "Стоп".

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

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