Как создать пользовательское разрешение и группу Active Directory, чтобы я мог проверять пользователей на это?

Я просмотрел множество результатов поиска, но я изо всех сил пытаюсь найти способ программно (с использованием С#) создать пользовательское разрешение и пользовательскую группу в Active Directory.

У меня есть приложение, которому потребуется около 50 отдельных разрешений, таких как: может шифровать данные, может расшифровывать данные, может экспортировать закрытый ключ, может удалять пару ключей и т. д. Эти разрешения будут назначены пользовательской группе. Например, группа может называться: стандартный пользователь, администратор безопасности и т. д.

Пользователям будет назначена одна или несколько из этих групп. Мне нужно, чтобы все это управлялось через Active Directory. Программное обеспечение, которое пишется, находится на C#. Пользователи будут в Active Directory.

Программное обеспечение проверит наличие у пользователя определенного разрешения, когда функция приложения должна быть выполнена. Если у пользователя нет разрешения, ему потребуется ввести переопределение. Это переопределение — просто запрос учетных данных другого пользователя, у которого ЕСТЬ соответствующие разрешения.

Я хочу подчеркнуть, что этим нужно управлять через Active Directory, потому что программное обеспечение работает в домене, а разрешениями будет управлять администратор домена.

Таким образом, я считаю, что функциональности ролей ASP.Net недостаточно? Кроме того, я не уверен, что Azure AD — это то же самое, что и Windows AD.

Я был бы очень признателен за любые рекомендации относительно того, какая сборка/пространство имен .NET предоставит следующие возможности:

  • Создать разрешение
  • Создать группу
  • Назначить разрешение группе
  • Назначить пользователя в группу
  • Удалить пользователя из группы
  • Удалить разрешение из группы

Мне нужно сделать это программно, потому что программное обеспечение будет иметь установщик и будет отвечать за добавление настраиваемых разрешений и групп для конкретных приложений во время установки, если они еще не существуют.

Возможно, я подхожу к этому неправильно, поэтому я открыт для других предложений. Пока я могу выполнить вышеперечисленное, тогда здорово!

Спасибо!


person SolidRegardless    schedule 20.07.2018    source источник


Ответы (2)


Насколько я понял,

Здесь вы можете попробовать код ниже

Попробуйте один раз

1) Создать группу

                PrincipalContext principalContext =
                    new PrincipalContext(ContextType.Domain, LDAPDomain, LDAPContainer,
                        LDAPAdmin, LDAPPassword);

                GroupPrincipal group = GroupPrincipal.FindByIdentity(principalContext, "groupName");

                if (group == null)
                {
                    GroupPrincipal groupPrincipal = new GroupPrincipal(principalContext);
                    groupPrincipal.Name = "groupName";
                    groupPrincipal.SamAccountName = "samAccountName";
                    groupPrincipal.UserPrincipalName = "userPrincipleName";
                    groupPrincipal.GroupScope = GroupScope.Global;
                    groupPrincipal.Description = "groupNameDescription";
                    groupPrincipal.DisplayName = "groupNameDisplayName";
                    groupPrincipal.Save();
                }

2) Добавить пользователя в группу

            GroupPrincipal group = GroupPrincipal.FindByIdentity(principalContext, "groupName");
            UserPrincipal user = UserPrincipal.FindByIdentity(principalContext, "userName");

            bool isUserAdded = false;


            if (user != null & group != null)
            {
                if (user.IsMemberOf(group))
                {
                    //Do Code
                }
                else
                {
                    group.Members.Add(user);
                    group.Save();
                    isUserAdded = user.IsMemberOf(group);
                }
            }

            if (isUserAdded)
            {
                //Do Code
            }

3) Удалить пользователя из группы

                GroupPrincipal group = GroupPrincipal.FindByIdentity(principalContext, "groupName");
                UserPrincipal user = UserPrincipal.FindByIdentity(principalContext, "userName");

                bool isUserRemoved = false;


                if (user != null & group != null)
                {
                    if (user.IsMemberOf(group))
                    {
                        group.Members.Remove(user);
                        group.Save();
                        isUserRemoved = user.IsMemberOf(group);
                    }
                    else
                    {
                        //Do Code

                    }
                }

                if (!isUserRemoved)
                {
                    //Do Code
                }

4) Добавить или удалить AccessRule (разрешение) для группы

Со своей стороны, у меня нет четкого представления о том, какова на самом деле ваша логика или реализация,

Но здесь я попытался дать решение для добавления или удаления правила доступа к группе

            //DirectoryEntry for OU Level
            DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://OU=MYOU,DC=MYDC,DC=COM");

            NTAccount account = new NTAccount("MYDC", "groupName");

            ActiveDirectoryAccessRule ruleRead = new ActiveDirectoryAccessRule(
                account,
                ActiveDirectoryRights.ReadProperty,
                AccessControlType.Allow,
                ActiveDirectorySecurityInheritance.None);

            ActiveDirectoryAccessRule ruleWrite = new ActiveDirectoryAccessRule(
                account,
                ActiveDirectoryRights.WriteProperty,
                AccessControlType.Deny,
                ActiveDirectorySecurityInheritance.None);

            if (Permission == "User shall be able to export private key from an RSA keypair")
            {
                directoryEntry.ObjectSecurity.AddAccessRule(ruleRead);

                directoryEntry.ObjectSecurity.AddAccessRule(ruleWrite);

                directoryEntry.Options.SecurityMasks = SecurityMasks.Dacl;

                directoryEntry.CommitChanges();

                Console.WriteLine("Added Deny Access to Read & Write.");
            }

            if (Permission == "User is able to decrypt imported data")
            {
                directoryEntry.ObjectSecurity.RemoveAccessRule(ruleRead);

                directoryEntry.ObjectSecurity.RemoveAccessRule(ruleWrite);

                directoryEntry.Options.SecurityMasks = SecurityMasks.Dacl;

                directoryEntry.CommitChanges();

                Console.WriteLine("Removed Deny Access to Read & Write.");
            }

            directoryEntry.Close();

            directoryEntry.Dispose();

Примечание. Сначала протестируйте весь приведенный выше код в своей тестовой среде.

person er-sho    schedule 20.07.2018
comment
Спасибо за этот указатель. Если хотите, как можно назначить пользовательские разрешения для GroupPrincipal? - person SolidRegardless; 20.07.2018
comment
приведенный выше код поможет вам? позвольте мне дать некоторое время, чтобы найти код в моем проекте - person er-sho; 20.07.2018
comment
Да это спасибо. Если бы я смог создать и назначить разрешения для этой группы, это решило бы мой общий вопрос. Я ценю ваше время. - person SolidRegardless; 20.07.2018
comment
не могли бы вы объяснить, какой тип разрешения вы хотите установить? - person er-sho; 20.07.2018
comment
Примером может служить пользовательская группа под названием Security Worker. Эта группа должна выполнить ряд заданий. Эти задачи определяются разрешениями, назначенными этой группе. Каждая задача будет иметь соответствующее разрешение. Одним из таких разрешений может быть Пользователь должен иметь возможность экспортировать закрытый ключ из пары ключей RSA. Другое разрешение может быть для того, чтобы Пользователь мог расшифровывать импортированные данные. Эти разрешения являются полностью пользовательскими. Я предположил, что отношения были такими: Пользователь -> Группа (ы) -> Разрешение (я)? - person SolidRegardless; 20.07.2018
comment
Пожалуйста, проверьте ответ. Если это поможет, примите ответ до Я проверю в своем проекте все о разрешениях. - person er-sho; 20.07.2018
comment
Точка разрешений лежит в основе моего вопроса. Я буду продолжать следить, и как только на этот вопрос будет дан полный ответ, я отмечу ответ как полный. Еще раз спасибо за вашу помощь до сих пор. - person SolidRegardless; 20.07.2018
comment
Пункты 2 и 3 сработали? AD содержит AccessRule для группы, которую мы установили для чтения и записи. Вы хотите это AccessRule? - person er-sho; 20.07.2018
comment
Привет, я считаю, что это правильно. Я не уверен, как назначить их группе, хотя. - person SolidRegardless; 20.07.2018
comment
Поскольку вы в основном правы и предоставили большую часть информации, я приму ответ. Обновите ответ, если найдете информацию о том, как добавить правило доступа в группу. - person SolidRegardless; 20.07.2018
comment
Я рад услышать от вас. Да, я нашел решение, которое скоро обновлю, потому что сейчас я ухожу из своего офиса :) - person er-sho; 20.07.2018

Вы пытаетесь использовать AD как в качестве хранилища AuthZ, так и в качестве механизма AuthZ, если я правильно понял вопрос. Первое (использование его в качестве хранилища данных) имеет смысл, но я не думаю, что это правильный инструмент для оценки доступа для вашего приложения.

Что бы я сделал, так это разделил ваши группы на два уровня:

  • Уровень 1 — группы разрешений (например, может шифровать, может расшифровывать и т. д.)

  • Уровень 2 — роли — это члены различных групп разрешений, и, в свою очередь, пользователи добавляются в эти группы для предоставления им ролей. Они наследуют разрешения, которые имеют роли, когда Windows создает их токен входа.

Предполагая, что ваше приложение использует проверку подлинности Windows, WindowsTokenRoleProvider (https://msdn.microsoft.com/en-us/library/system.web.security.windowstokenroleprovider(v=vs.110).aspx) покажет все членство в группах вверх в ваше приложение, и вы можете проверить, входит ли кто-то в группу разрешений, и позволить им что-то делать (или нет)...

person Brian Desmond    schedule 25.07.2018
comment
Хорошо, я понимаю, что вы имеете в виду. Проблема в том, что разрешения (уровень 1) очень детализированы и должны динамически назначаться группам (уровень 2). Пользователь может настроить, какие группы могут делать что, используя пользовательский интерфейс приложения. Мне нравится идея иметь группы уровня 1 и уровня 2, потому что тогда ими можно управлять через AD. Однако как обеспечить, чтобы только группы уровня 1 могли быть назначены уровню 2? Этот элемент управления возможен с пользовательским пользовательским интерфейсом приложения. - person SolidRegardless; 27.07.2018
comment
Кроме того, мне нужно проверить, но я надеюсь, что правила доступа можно просмотреть в объекте GroupPrincipal. Возможно, используя свойство ObjectSecurity. Кажется, что приведенное выше предложение удерживает правила доступа от обычного прочтения AD, потому что они действительно не касаются ничего, кроме приложения. Сохранение его в AD также означает, что одни и те же разрешения, применяемые к группам, синхронизируются по всему домену для других экземпляров того же приложения (т. е. в другом поле). - person SolidRegardless; 27.07.2018
comment
Свойство ObjectSecurity дает вам ACL для самой группы. Это определяет разрешения на выполнение операций над группой в AD. Учитывая ваше описание необходимости синхронизации, я бы подумал о создании пользовательского раздела приложения в AD вместе с некоторой пользовательской схемой для представления вашей модели данных. Вы можете использовать группы безопасности для назначения разрешений и связывания их с определениями разрешений, хранящимися в разделе приложения. Вы бы предоставили своему приложению доступ для изменения этих данных и имели бы пользовательский интерфейс в приложении для управления ими. - person Brian Desmond; 28.07.2018
comment
Да, это звучит разумно. Если у вас есть какие-либо рекомендации для этого, я могу подумать об изменении лучшего ответа на ваше предложение. Я попробовал предложение из выбранного на данный момент лучшего ответа, и оно не работает. ObjectSecurity, похоже, работает неправильно, и я понимаю причины на данный момент. - person SolidRegardless; 28.07.2018
comment
Их немного, но вот пара ссылок: docs. microsoft.com/en-us/windows/desktop/AD/ и docs.microsoft.com/en-us/windows/desktop/AD/. Бесстыдная заглушка, в моей книге Active Directory 5th Ed от O'Reilly также есть хороший контент по схеме, хотя и не так много по разделам приложений. - person Brian Desmond; 29.07.2018