Аутентификация ADAM с пользователем ADAM и простое связывание - PullRequest
1 голос
/ 20 ноября 2008

Я следовал пошаговому руководству 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 ]

2 голосов
/ 09 июня 2011

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

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

1 голос
/ 09 мая 2013

Спасибо Райану за подсказку по 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);
        }
    }
0 голосов
/ 20 ноября 2008

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

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

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

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

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

0 голосов
/ 20 ноября 2008

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

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

...