DirectoryServices.AccountManagement - эффективность проверки членства в группе

У нас есть группа в Active Directory с более чем 70 тысячами учетных записей пользователей. Мне нужно проверить, является ли кто-то членом этой группы. Код будет работать в веб-приложении с большим количеством одновременных пользователей. Я бы предпочел придерживаться System.DirectoryServices.AccountManagement по возможности уменьшить количество кода, написанного для этого приложения.

По-видимому, существует 2 основных подхода к проверке того, является ли кто-либо участником:

  1. Используйте UserPrincipal.IsMemberOf() чтобы получить логическое значение, указывающее членство
  2. Используйте UserPrincipal.GetGroups(). чтобы получить список членства в группах, который я могу проверить вручную

Я хочу избежать перечисления 70 тыс. пользователей, чтобы проверить, входит ли кто-то в группу, поэтому вариант 2 кажется более эффективным по номинальной стоимости. Когда я приступаю к работе, я могу провести некоторые тесты против обоих методов, но я хотел получить некоторую информацию о том, что эти методы действительно делают под прикрытием. Я на правильном пути в своих размышлениях?

И последнее замечание о библиотеке, которую я использую. Могу ли я повысить производительность, если полностью откажусь от System.DirectoryServices.AccountManagement и напишу свои собственные запросы LDAP?


person Brian Lyttle    schedule 15.12.2009    source источник


Ответы (1)


Ну, одна вещь, которую вы, возможно, захотите рассмотреть, чтобы сделать вещи более эффективными, основана на том факте, что членство в группе действительно управляется группой, у которой есть список пользователей (и групп), которые являются ее членами. «memberOf» для пользователя на самом деле является рассчитанной «обратной ссылкой» — см. это отличная статья для получения дополнительной информации.

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

Вы бы сделали что-то вроде:

GroupPrincipal myGroup = Group.FindByIdentity(context, "myGroupName");

var members = myGroup.GetMembers();

При этом вы сможете повысить производительность благодаря кэшированию информации о членстве в группе. Попытайся!

person marc_s    schedule 15.12.2009
comment
Обрабатывает ли этот подход случаи, когда пользователь является членом группы, которая является членом желаемой группы? - person VoteCoffee; 20.05.2014
comment
Отличная статья, кажется, переехала. Это может быть: tutorials.csharp-online.net/ - person mwardm; 03.06.2014