UserPrincipal.FindByIdentity() всегда возвращает null

Я использую LdapAuthentication для входа пользователя в Active Directory. Я хочу найти все группы, к которым принадлежит пользователь. Я использую следующий код:

string adPath = "LDAP://OU=HR Controlled Users,OU=All Users,DC=myDomain,DC=local";
LdapAuthentication adAuth = new LdapAuthentication(adPath);
try
{
    if (true == adAuth.IsAuthenticated("myDomain", txtLoginEmail.Text, txtLoginPassword.Text))
    {
        string email = txtLoginEmail.Text;

        using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
        {
            UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.Name, email);
            foreach (var group in user.GetGroups())
            {
                Console.WriteLine(group.Name);
            }
        }
    }
}
catch(Exception e) { /* Handle Error */ }

Моя проблема в том, что когда я вызываю UserPrincipal.FindByIdentity(), я всегда получаю нулевое значение, даже если аутентификация пользователя работает как положено.

Почему это происходит? Есть проблема с кодом или с моим подходом? Это выполняется внутри приложения ASP.NET 4.0 WebForms.

Обновление:

По-видимому, я использовал неправильный IdentityType (cn). Я проверил отладку, и имя учетной записи «UserA».

введите описание изображения здесь

Поэтому я попытался использовать следующий код вручную:

UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.Name, "UserA");

Но все же я получаю ноль.

Обновление 2 (решено):

Проблема была двоякой. Мне нужно было указать имя моего контроллера домена при объявлении файла PrincipalContext.

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "myDomain"))
{
   // code here...
}

Затем при поиске UserPrincipal я использовал неправильный IdentityType; Я искал с IdentityType.Name — это имя учетной записи — вместо IdentityType.SamAccountName — это имя пользователя.

UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, email);

Проблема решена.


person MSOACC    schedule 05.05.2016    source источник


Ответы (1)


Используя IdentityType.Name, вы сообщаете ему, что передаваемое значение является именем учетной записи (которое является атрибутом cn). Если вы хотите сопоставить имя пользователя (атрибут sAMAccountName), вам нужно передать IdentityType.SamAccountName.


Старый ответ: похоже, вы отправляете ему адрес электронной почты. Так что это действительно всегда ничего не возвращает.

AD не считает адрес электронной почты уникальным идентификатором, поэтому вы не можете использовать FindByIdentity с адресом электронной почты.

Вот пример поиска по адресу электронной почты: http://doogalbellend.blogspot.ca/2012/03/finding-userprincipal-for-email-address.html

person Gabriel Luci    schedule 05.05.2016
comment
Спасибо за ответ :) Этот ярлык на самом деле является именем пользователя, а не адресом электронной почты, мой коллега, должно быть, неправильно назвал его. Имеет ли это значение или нет? В любом случае, я обновил вопрос, добавив более подробную информацию, и я проверю ссылку, которую вы разместили. PS. В имени домена могут быть несоответствия, но я ввел их вручную, чтобы сохранить конфиденциальность моей компании. - person MSOACC; 05.05.2016
comment
Бум, с вашей помощью все заработало. Я обновлю с рабочим кодом / решенной проблемой. - person MSOACC; 05.05.2016
comment
Аналогичная проблема, но более простое решение :) для сопоставления по имени пользователя вам нужно использовать IdentityType.SamAccountName. - person Gabriel Luci; 05.05.2016
comment
Это не работает для меня, оно по-прежнему равно нулю, и я передаю sAMAccountName, и тип правильный, он просто по какой-то причине ничего не возвращает, даже если пользователь существует. - person Nathan McKaskle; 11.08.2017
comment
Итак, вы звоните UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username), где username — это имя sAMAccountName, и ничего не получаете? context указывает на правильный домен? (у вас есть более одного домена в вашей среде?) - person Gabriel Luci; 12.08.2017