我正在使用此方法返回用户所属的所有组(递归),以便我可以执行一些应用程序级别的授权。
我从服务进程中经常调用这个(比如用户活动时每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[] {};
}
}
}
答案 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查询的结果,而不会看到您可能期望的更新。
或者,您正在进行更改,然后查询尚未复制到的域控制器。当您重新启动服务时,您的应用程序将访问一个新的域控制器,其中进行了更改或已将其复制到。
所有缓存优化都必须在您身边进行,您需要决定查询域名以检查成员资格更新的频率。