为什么我们必须等待一段时间才能从UserPrincipal.GetAuthorizationGroups方法获取最新的组信息?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我们必须等待一段时间才能从UserPrincipal.GetAuthorizationGroups方法获取最新的组信息?相关的知识,希望对你有一定的参考价值。
我们有一个AD用户,例如userA,它是GroupA,GroupB的成员。
使用UserPrincipal.GetAuthorizationGroups方法提供这些组。
然后我们将userA添加到另一个组,例如GroupC。
但是添加到新组并运行UserPrincipal.GetAuthorizationGroups方法之后,仍然显示GroupA,GroupB。 不显示GroupC。
如果我们有时等待(大约10分钟),或者切换用户并再次登录,那么只有UserPrincipal.GetAuthorizationGroups方法显示GroupC以及GroupA,GroupB。
为什么我们必须等待或再次登录以获得最新值?
对于UserPrincipal.GetGroups方法,我们不必等待或再次登录。我们正在使用UserPrincipal.GetAuthorizationGroups方法,因为我们也需要嵌套组
似乎特定的实现方式并非100%受信任。用户组将被缓存,并且该功能未将其考虑在内。
有关更多信息和解决方案,请点击此处https://milestone.topics.it/2012/12/userprincipalgetauthorizationgroupsoh-my.html
IEnumerable<String> GetGroups( String samAccountName )
{
var userNestedMembership = new List<string>();
var domainConnection = new DirectoryEntry();
domainConnection.AuthenticationType = System.DirectoryServices.AuthenticationTypes.Secure;
var samSearcher = new DirectorySearcher();
samSearcher.SearchRoot = domainConnection;
samSearcher.Filter = "(samAccountName=" + samAccountName + ")";
samSearcher.PropertiesToLoad.Add( "displayName" );
var samResult = samSearcher.FindOne();
if ( samResult != null )
{
var theUser = samResult.GetDirectoryEntry();
theUser.RefreshCache( new string[] { "tokenGroups" } );
foreach ( byte[] resultBytes in theUser.Properties[ "tokenGroups" ] )
{
var SID = new SecurityIdentifier( resultBytes, 0 );
var sidSearcher = new DirectorySearcher();
sidSearcher.SearchRoot = domainConnection;
sidSearcher.Filter = "(objectSid=" + SID.Value + ")";
sidSearcher.PropertiesToLoad.Add( "name" );
var sidResult = sidSearcher.FindOne();
if ( sidResult != null )
{
userNestedMembership.Add( ( string )sidResult.Properties[ "name" ][ 0 ] );
}
}
}
return userNestedMembership;
}
以上是关于为什么我们必须等待一段时间才能从UserPrincipal.GetAuthorizationGroups方法获取最新的组信息?的主要内容,如果未能解决你的问题,请参考以下文章