#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. Это также решит проблемы в случае, если группа будет переименована