Аутентификация 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();

Спасибо.


person user26218    schedule 19.11.2008    source источник


Ответы (3)


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

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

person Ryan Sweet    schedule 09.06.2011

Спасибо, Райан, за совет по 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);
        }
    }
person Kwex    schedule 09.05.2013

Я не использовал 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).

person Josh Kelley    schedule 20.11.2008