【问题标题】:Why we have to wait for sometime to get latest group info from UserPrincipal.GetAuthorizationGroups method?为什么我们必须等待一段时间才能从 UserPrincipal.GetAuthorizationGroups 方法获取最新的组信息?
【发布时间】:2020-01-29 14:43:14
【问题描述】:

我们有一个 AD 用户,比如说 userA,它是 GroupAGroupB 的成员。

使用 UserPrincipal.GetAuthorizationGroups 方法提供这些组。

然后我们将 userA 添加到另一个组,例如 GroupC

但在添加到新组并运行 UserPrincipal.GetAuthorizationGroups 方法后,仍然显示 GroupA、GroupB。 不显示 GroupC

如果我们有时(大约 10 分钟)等待或切换用户并再次登录,则只有 UserPrincipal.GetAuthorizationGroups 方法会显示 GroupC 以及 GroupA、GroupB。

为什么我们必须等待或重新登录才能获得最新值?

对于UserPrincipal.GetGroups 方法,我们无需等待或再次登录。我们正在使用 UserPrincipal.GetAuthorizationGroups 方法,因为我们还需要嵌套组

【问题讨论】:

    标签: c# .net active-directory


    【解决方案1】:

    似乎具体的实现不是 100% 受信任的。用户组被缓存,函数不考虑这一点。

    可以这么说,它在大多数情况下(如果不是所有情况)都有意义。新组在登录后应用,每次检索都查询 AD 似乎有点矫枉过正。

    欲了解更多信息和解决方案,请点击此处: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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-10
      • 2012-01-29
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多