我们在Active Directory中拥有一个拥有超过70,000个用户帐户的组。我需要检查某人是否是该组的成员。该代码将在具有大量并发用户的Web应用程序中运行。如果可能的话,我宁愿坚持使用System.DirectoryServices.AccountManagement来减少为此应用程序编写的代码量。
似乎有两种检查某人是否是会员的一般方法:
我想避免枚举70k用户检查某人是否在某个群组中,因此选项2似乎在面值上更有效。当我开始工作时,我可以针对这两种方法进行一些测试,但我想了解一下这些方法在封面上的实际作用。在我的思考中,我是否在正确的轨道上?
关于我正在使用的库的最后一点。如果我完全退出System.DirectoryServices.AccountManagement并编写自己的LDAP查询,我可以获得更好的性能吗?
答案 0 :(得分:1)
嗯,您可能想要考虑提高效率的一件事是基于这样一个事实,即组成员资格实际上是由具有作为其成员的用户(和组)列表的组管理的。用户的“memberOf”实际上是一个计算的“反向链接” - 有关详细信息,请参阅此excellent article。
因此,如果您需要检查一个或两个组中的成员身份,那么走到这些组并询问他们的成员列表并缓存这些组可能要容易得多。在评估用户时,您只需要检查他们的DN是否显示在其中一个组成员列表中,而不会反复敲击AD。
你会做的事情如下:
GroupPrincipal myGroup = Group.FindByIdentity(context, "myGroupName");
var members = myGroup.GetMembers();
有了这个,你可以通过缓存组成员资格信息获得更好的性能。试试吧!