【问题标题】:Check Active Directory Role taking too long检查 Active Directory 角色花费太长时间
【发布时间】:2011-07-24 18:29:19
【问题描述】:

我有此代码来检查组成员身份,但它似乎需要很长时间才能响应并减慢我的应用程序,响应需要将近 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;
                }

            }

【问题讨论】:

  • 您能否将响应缓存一段可接受的时间?
  • 我该怎么做?我正在使用 WCF 服务 .net 4.0
  • 组员多吗?如果是这样,您可能会通过查找用户帐户的组是否包含您要查找的组而不是查找组的成员是否包含您要查找的帐户来获得更快的响应。
  • @adrianbanks 我该怎么做
  • 我已经有一段时间没有自己做了这个并且没有 VS 手头 - userAccount 对象是否有 Groups 属性/GetGroups() 函数?

标签: c# active-directory


【解决方案1】:

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

也许这种方式会更快一些?

【讨论】:

  • 什么是 grp,当我构建时我得到 grp 没有;t 在当前的 conetxt 中退出
  • @marc_s - 你介意看看这个。这真的很奇怪,我无法得到专家的认可:stackoverflow.com/questions/13147132/…
【解决方案2】:

由于我们没有足够的信息,所以无法给您答案,只能追踪您的问题...

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

假设只是你的实现很慢......

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

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

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

编辑:针对有关在 WCF 中缓存的问题,有多种方法可以解决此问题 - 您可以替换服务类的持久性提供程序以使其成为单例 - 然后您可以只需使用私有变量/内存进行缓存。这要求您的类是线程安全的。

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

【讨论】:

  • 我使用了 VS 分析器,发现这个特定部分花费的时间太长。
  • 特别是哪一行,循环、linq 或 GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupName) ?还是3的分裂?您是否启用了 .Net Framework 调试(在 Tools-Options-Debugging 下),这允许您进入框架本身 - 启用此功能,打开调试符号的自动下载,这样您就可以看到可读的代码而不是反汇编,然后重新分析。这应该具体向您显示哪些调用导致了问题 - 我怀疑它在网络代码中,但可能是任何东西(也许它正在尝试缓存但缓存超时等)
  • @Natasha 我可能误解了你的意思,但你可以使用 WCF 服务中的缓存框架来缓存响应或在客户端中缓存 WCF 调用的结果 - 所以它应该可以在结尾。这个msdn.microsoft.com/en-us/library/dd997362.aspx 是一个 WPF 缓存示例,但可以应用于其他 .Net 框架 - 正如我所说,在这种情况下我可能误解了你的观点,请澄清:)
猜你喜欢
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
相关资源
最近更新 更多