如何创建自定义 Active Directory 权限和组,以便我可以根据此验证用户?

How do I create a custom Active Directory permission and group so that I can verify users against this?

我查看了许多搜索结果,但我正在努力寻找一种方法来以编程方式(使用 C#)在 Active Directory 中创建自定义权限和自定义组。

我有一个应用程序需要大约50个单独的权限,例如:可以加密数据,可以解密数据,可以导出私钥,可以删除密钥对等。这些权限将分配给一个自定义组.例如,该组可能被称为:标准用户、安全管理员等

用户将被分配到这些组中的一个或多个。我需要通过 Active Directory 管理所有这些。正在编写的软件是用 C# 编写的。用户将在 Active Directory 中。

当要执行应用程序上的功能时,软件将检查用户是否具有特定权限。如果用户没有权限,则他们将需要输入覆盖。此覆盖只是提示输入具有相关权限的另一个用户的凭据。

我想强调的是,这需要通过 Active Directory 进行管理,因为该软件 运行 在域上,权限将由域管理员管理。

因此,我认为 ASP.Net 角色功能还不够?另外,我不确定Azure AD是否与Windows AD相同。

对于 .NET assembly/namespace 将提供以下功能的任何指导,我将不胜感激:

我需要以编程方式执行此操作,因为该软件将有一个安装程序,并且将负责在安装期间添加特定于应用程序的自定义权限和组(如果它们尚不存在)。

我可能处理这个问题有误,所以我愿意接受其他方面的建议。只要我能做到以上那点就好了!

谢谢!

据我了解,

在这里你可以试试下面的代码

试一次

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) 添加或删除组的访问规则(权限)

在我这边,我不清楚你的逻辑或实现是什么,

但在这里我试图给出一个解决方案来添加或删除组的访问规则

            //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();

注意:请先在您的测试环境中测试以上所有代码。

如果我正确地回答了问题,你正在尝试将 AD 用作你的 AuthZ 商店和你的 AuthZ 引擎。前者(将其用作数据存储)非常有意义,但是,我认为它不是评估应用程序访问权限的正确工具。

我要做的是将您的群组分为两个级别:

  • 级别 1 - 权限组(例如可以加密、可以解密等)

  • 2 级 - 角色 - 这些是各种权限组的成员,反过来用户被添加到这些组以授予他们角色。当他们的登录令牌由 Windows.

  • 构建时,他们将继承角色所拥有的权限

假设您的应用程序使用 Windows 身份验证,WindowsTokenRoleProvider (https://msdn.microsoft.com/en-us/library/system.web.security.windowstokenroleprovider(v=vs.110).aspx) 会将所有组成员身份显示到您的应用程序中,然后您可以检查是否有人在权限组并让他们做某事(或不做)...