Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Brian LyttleОтветов: 1

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

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

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

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

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

performanceactive-directoryldap

Ответы

Ответ 1 · рейтинг 1 · marc_s

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

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

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

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

var members = myGroup.GetMembers();

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы