我应该从System.DirectoryServices.AccountManagement查询中缓存多少结果?

时间:2015-07-14 17:18:29

标签: c# caching active-directory memorycache

我正在使用此方法返回用户所属的所有组(递归),以便我可以执行一些应用程序级别的授权。

我从服务进程中经常调用这个(比如用户活动时每10-20秒一次),并且能够将结果缓存到(例如)System.Runtime.Caching.MemoryCache ....但是,似乎GetAuthorizationGroups的结果已经被缓存(即列表在我重新启动服务之前不会更新)

有谁知道微软已经为此类查询提供了多少优化?即我不想通过不必要的缓存过早地优化。

    public static string[] GetActiveDirectoryGroups(string userName)
    {
        using (var context = new PrincipalContext(ContextType.Domain, "mydomain"))
        {
            using (var user = UserPrincipal.FindByIdentity(context, IdentityType.UserPrincipalName, userName))
            {
                return user != null ? 
                    user.GetAuthorizationGroups()
                        .Select(group => group.SamAccountName)
                        .ToArray()
                    : new string[] {};
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

我没有在没有显式配置的System.DirectoryServices.ActiveDirectory中发现任何内置缓存 - 例如使用DirectorySearcher:https://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.cacheresults(v=vs.110).aspx

如果您没有进行任何类型的缓存,.NET将不会自动为您执行任何缓存。每次运行函数时,它都会查询Active Directory。听起来好像您偶然会存储Active Directory查询的结果,而不会看到您可能期望的更新。

或者,您正在进行更改,然后查询尚未复制到的域控制器。当您重新启动服务时,您的应用程序将访问一个新的域控制器,其中进行了更改或已将其复制到。

所有缓存优化都必须在您身边进行,您需要决定查询域名以检查成员资格更新的频率。