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