检查活动目录角色耗时过长

本文关键字:角色 活动 检查 | 更新日期: 2023-09-27 18:03:36

我有这个代码来检查组成员资格,但它似乎需要太长时间来响应和减慢我的应用程序,它需要几乎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;
                }
            }

检查活动目录角色耗时过长

我手头没有您的特定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;
   }
}

也许那样事情会快一点?

我不能给你一个答案,因为我们没有足够的信息,但要追查你的问题…

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

假设只是你的实现缓慢…

你调用的WCF服务托管在一个网站,需要时间来编译/加载?为了测试这一点,进行多个调用并比较延迟-如果第一个调用明显更长,请查看您的IIS设置。您可以增加应用程序池卸载前的空闲时间等来缓解问题。

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

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

Edit:关于在WCF中缓存的问题,有很多方法可以解决这个问题——你可以替换服务类的持久性提供者,使其成为单例——然后你可以只使用私有变量/内存进行缓存。这就要求你的类是线程安全的。

选项包括:数据库、文件系统、应用级内存缓存(system . runtime . caching)