【问题标题】:DirectoryServices.AccountManagement - group membership checking efficiencyDirectoryServices.AccountManagement - 组成员检查效率
【发布时间】:2009-12-15 02:53:36
【问题描述】:

我们在 Active Directory 中有一个拥有超过 70k 用户帐户的组。我需要检查某人是否是该组的成员。该代码将在具有大量并发用户的 Web 应用程序中运行。如果可能的话,我宁愿坚持使用System.DirectoryServices.AccountManagement,以减少为此应用程序编写的代码量。

检查某人是否是会员似乎有两种通用方法:

  1. 使用UserPrincipal.IsMemberOf() 获取表示成员资格的布尔值
  2. 使用UserPrincipal.GetGroups() 获取我可以手动检查的群组成员列表

我想避免枚举 70k 用户来检查是否有人在一个组中,所以选项 2 在面值上似乎更有效。当我开始工作时,我可以对这两种方法进行一些测试,但我想了解这些方法在幕后的实际作用。我的想法是否正确?

关于我正在使用的库的最后一点。如果我完全退出 System.DirectoryServices.AccountManagement 并编写自己的 LDAP 查询,是否可以获得更好的性能?

【问题讨论】:

    标签: c# asp.net performance active-directory ldap


    【解决方案1】:

    嗯,您可能要考虑提高效率的一件事是基于这样一个事实,即组成员身份实际上是由具有作为其成员的用户(和组)列表的组管理的。用户上的“memberOf”实际上是一个计算出来的“反向链接” - 请参阅此excellent article 了解更多信息。

    因此,如果您需要检查一个或两个群组的成员资格,那么直接走到这些群组并询问他们的成员列表并缓存这些可能会容易得多。在评估用户时,您只需检查他们的 DN 是否出现在其中一个组成员列表中,而无需一遍又一遍地点击 AD。

    你会做这样的事情:

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

    有了这个,由于组成员信息的缓存,您应该能够获得更好的性能。试试看!

    【讨论】:

    • 这种方法是否可以处理用户是某个组的成员而该组是所需组的成员的情况?
    • “优秀文章”似乎已经移动了。可能是这个:tutorials.csharp-online.net/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多