检查Active Directory角色需要太长时间

时间:2011-07-24 18:29:20

标签: c# active-directory

我有这个代码来检查群组成员资格,但似乎需要花费太长时间来响应和减慢我的应用程序,它需要几乎7-12秒的时间来响应,我只需要检查一个特定的群组成员身份,是有更快的方法吗?

  public static bool isInRole(UserAccount userAccount, string groupName)
        {


            using (var ctx = new PrincipalContext(ContextType.Domain, userAccount.DomainName))
            {
                using (var grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupName))
                {
                    bool isInRole = grp != null &&
                        grp
                        .GetMembers(true)
                        .Any(m => m.SamAccountName == userAccount.UserName);
                    return isInRole;
                }

            }

2 个答案:

答案 0 :(得分:1)

我无法给你答案,因为我们没有足够的信息,只能追查你的问题......

首先,尝试使用标准工具(在Web服务器上运行)查询AD - 这是否同样慢?如果是这样,那可能是网络/ DC问题。

假设这只是你的实施很慢......

您是否正在调用taking time to compile/load网站中托管的WCF服务?要对此进行测试,请执行多次调用并比较延迟 - 如果第一次调用显着更长,请查看您的IIS设置0您可以在应用程序池卸载之前增加空闲时间等,以缓解此问题。

如果您确定代码花费的时间过长,请使用Visual Studio Pofiler来识别导致延迟的函数/调用 - 如果它在您的代码中,请优化它,如果它在框架中那么你要么使用它错了,要么你发现框架有问题(不太可能)。

如果您可以修改问题以包含上述答案,我们可能会提供进一步的帮助

编辑:为了回应有关WCF内缓存的问题,有很多方法可以解决这个问题 - 您可以将服务类的持久性提供程序替换为单例 - 然后就可以了只需使用私有变量/内存进行缓存。这要求您的类是线程安全的。

替代方案包括:数据库,文件系统,应用程序范围的内存缓存(System.Runtime.Caching

答案 1 :(得分:0)

我没有你手头的特定AD来测试这个 - 但是值得尝试:不是为特定用户检查群组成员(可能有成千上万的成员),为什么不呢?检查用户的组成员身份以查看用户是否具有正确的组??

类似的东西:

public static bool isInRole(UserAccount userAccount, string groupName)
{
   using (var ctx = new PrincipalContext(ContextType.Domain, userAccount.DomainName))
   using (var user = UserPrincipal.FindByIdentity(ctx, userAccount.UserName))
   {
      bool isInRole = user != null &&
                      user.GetAuthorizationGroups()
                      .Any(g => g.Name == groupName);
      return isInRole;
   }
}

也许这样的事情会更快一些?