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)


arrow_upward
1
arrow_downward

Ну, одна вещь, которую вы, возможно, захотите рассмотреть, чтобы сделать вещи более эффективными, основана на том факте, что членство в группе действительно управляется группой, у которой есть список пользователей (и групп), которые являются ее членами. «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