Чтение групп авторизации пользователей из Active Directory - PullRequest
2 голосов
/ 23 декабря 2010

В нашей системе мы читаем группы безопасности пользователей из Active Directory двумя немного разными способами.В одном случае в списке групп, возвращаемых AD, отсутствуют доменные локальные группы.Ответ от GetAuthorizationGroups () зависит от используемого PrincipalContext.В неудачных сценариях GetAuthorizationGroups () будет возвращать только глобальные группы.В результате отсутствуют все локальные группы домена из AD.Кто-нибудь может объяснить, почему?

Неудачное решение:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net");

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB");

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups();

В этом случае процесс выполняется «UserA».«UserA» является членом домена «our.domain.net».«UserA» - это тот же пользователь, что и конкретно идентифицированный пользователь в рабочем решении.Из-за этого PrincipalContext должен быть идентичен PrincipalContext в рабочем решении.Ответ от GetAuthorizationGroups () в этом решении пропускает локальные группы домена из AD.

Рабочее решение:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net", "UserA", "PasswordA");

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB");

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups();

В этом случае вызывающий пользователь идентифицируется конкретно по имени пользователя и паролю, когдасоздание основного контекста.В этом случае AD возвращает все группы, в которые входит пользователь.Это поведение, которое я хотел бы увидеть и в неудачном решении.В некоторых случаях у меня нет пароля пользователя UserA, и по этой причине рабочее решение недоступно.

Пожалуйста, помогите мне понять, почему отказавшее решение не возвращает все группы, членом которых является пользователь.из.

Ответы [ 2 ]

1 голос
/ 02 октября 2015

"Он пропускает локальные группы домена из AD" , потому что вы, вероятно, повторяете результирующий цикл groups с foreach и получаете исключение NoMatchingPrincipalException для одной из групп, которые пользовательне имеет доступа для чтения, и в этот момент он прекращает итерацию, не получая остальных групп.

В качестве решения вы можете использовать следующий итератор (код структуры foreach), чтобы получить всеостальные группы:

var enumerator = groups.GetEnumerator();                
while (enumerator.MoveNext())
{
    try
    {
        var e = enumerator.Current;
        listView1.Items.Add(e.Name);
    }
    catch (NoMatchingPrincipalException)
    {
    }
}
1 голос
/ 10 июня 2011

Мы наконец нашли проблему.Оказалось, что проблемы с кодированием вообще не возникли.Странное поведение было вызвано ошибочным уровнем домена в Active Directory.

Уровень домена должен был быть установлен на «2003 функциональный уровень»

Теперь все работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...