Аутентификация 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, надеюсь, вам не составит труда начать:
- Загрузите, установите и запустите программное обеспечение.
- В разделе "Захват" нажмите "Параметры".
- Установите для интерфейса либо localhost / loopback, либо свой интерфейс Ethernet. (Я не думаю, что loopback работает должным образом в Windows; возможно, вы захотите выбрать свой интерфейс Ethernet и обновить URL-адрес LDAP в своем коде C#, чтобы использовать ваше имя хоста, а не localhost.)
- Под Фильтром захвата введите "TCP-порт 50000" (без кавычек).
- Нажмите "Пуск", запустите операцию подключения, затем перейдите в меню "Захват" и нажмите "Стоп".
Wireshark может проанализировать протокол для вас, поэтому вам не нужно слишком хорошо разбираться в деталях протокола, хотя чем больше вы знаете, тем легче будет интерпретировать все детали. Вы можете запустить пару экземпляров Wireshark, чтобы легко сравнить два разных захвата (ваш код и LDP).