Назад | Перейти на главную страницу

случайное изменение группового запроса служб каталогов

Я получаю необычное поведение в моем приложении 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);  
    } 
 }

Поскольку пользователь аутентифицирован, у вас есть его токен. У токена есть полное членство в группе. Нет необходимости запрашивать AD для групп. (Однако вам может потребоваться запрос для преобразования идентификаторов безопасности в понятные имена).

Если вы можете выдавать себя за другое лицо, это может быть очень просто:

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. На веб-сайте Джо Каплана есть несколько хороших примеров по этому поводу.

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