目录服务组查询随机变化

目录服务组查询随机变化

我的 asp.net 应用程序中出现了异常行为。我有使用目录服务查找给定的经过身份验证的用户的 AD 组的代码。代码如下...

string username = "user"; 
string domain = "LDAP://DC=domain,DC=com"; 
DirectorySearcher search = new DirectorySearcher(domain); 
search.Filter = "(SAMAccountName=" + username + ")"; 

然后我查询并获取给定用户的群组列表。问题在于代码以字符串列表的形式接收群组列表。随着我们最新版本的软件发布,我们开始以 byte[] 的形式接收群组列表。

系统将返回字符串,突然返回字节[],然后重新启动后再次返回字符串。

有人有主意吗?

代码示例:

DirectoryEntry dirEntry = new DirectoryEntry("LDAP://" + ldapSearchBase);  
DirectorySearcher userSearcher = new DirectorySearcher(dirEntry)  
  { SearchScope = SearchScope.Subtree,  
    CacheResults = false,  
    Filter = ("(" + txtLdapSearchNameFilter.Text + "=" + userName + ")") 
  };  

userResult = userSearcher.FindOne();  
ResultPropertyValueCollection valCol = userResult.Properties["memberOf"];  

foreach (object val in valCol)  
{  
    if (val is string)  
    { 
        distName = val.ToString(); 
    }  
    else  
    {  
        distName = enc.GetString((Byte[])val);  
    } 
 }

答案1

由于用户已通过身份验证,因此您拥有他们的令牌。令牌具有他们的完整组成员身份。无需查询 AD 中的组。(不过,您可能需要查询以将 SID 转换为友好名称)。

如果你能够模仿,事情可能会像这样简单:

using (WindowsImpersonationContext userImpersonationContext = WindowsIdentity.Impersonate(Request.LogonUserIdentity.Token))  
{  
    WindowsIdentity _identity = WindowsIdentity.GetCurrent();

    IdentityReferenceCollection _adGroups = _identity.Groups;
    StringBuilder _adGroupsSb = new StringBuilder();
    foreach (IdentityReference _group in _adGroups)
    {
        _adGroupsSb.AppendLine(_group.Translate(typeof(NTAccount)).Value);
    }

    log.Info("User: " + _identity.Name + "; " + _adGroups.Count + " groups: " +
        Environment.NewLine + Environment.NewLine + _adGroupsSb.ToString());
}

如果您打算查询 AD,我建议您使用 TokenGroups 而不是 MemberOf。Joe Kaplan 的网站上有一些很好的例子。

http://directoryprogramming.net/files/3/csharp/entry1.aspx

相关内容