Проверка пользователя на соответствие группе объявлений

#c# #asp.net-mvc #active-directory

#c# #asp.net-mvc #active-directory

Вопрос:

Есть сценарий для проверки того, что вошедший в систему пользователь принадлежит к группе AD, указанной в web.config. Приведенный ниже код работает нормально, но требует много времени при циклическом просмотре. (В некоторых случаях пользователь имеет отношение к группе 100 в AD) строка.

Есть ли способ добиться этого с помощью прямого метода для повышения производительности.

Примечание: я пробовал метод Contains() группы obj, но не смог передать строку в качестве входных данных.

 allowedRoles = "Role1, Role2"; //Read from web.config
string[] allowedRolesList = allowedRoles.Split(',');
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, UserDomain);
UserPrincipal user = UserPrincipal.FindByIdentity(ctx,IdentityType.SamAccountName,SLID);
if (user != null)
{
    var groups = user.GetAuthorizationGroups();
    foreach (string allowedrole in allowedRolesList)
    {
        foreach (GroupPrincipal group in groups)
        {
            if (group.Name.ToLower() == allowedrole.ToLower())
            {
                return true;
            }
        }
    }
}
  

Комментарии:

1. что такое тип groups данных ..? если это массив string[], то вы все равно можете выполнить .Contains()

2. Я не уверен, что это решение может повысить производительность, но оно может сделать ваш метод более «полезным». Вы могли бы сделать что-то вроде string[] allowedRolesList = allowedRoles . ToLower().Split(‘,’); затем в вашем операторе If возвращайте группы. Выберите (p=>p.Name . ToLower()) . Intersect(allowedRolesList).Any() Это позволит сравнить два списка строк, имена групп и разрешенные роли. Если значение в одном из них совпадает с другим, ваш метод .Any() должен быть true , также результат пересечения может дать вам отдельный список совпадающих значений, поэтому вместо bool возвращайте список совпадающих результатов.

3. Вы можете указать SID группы в web.config вместо имени группы, затем запросить атрибут user tokenGroups через LDAP ADSI и проверить, содержит ли он этот sid. Это также решит проблемы в случае, если группа будет переименована