ฉันจะสร้างสิทธิ์และกลุ่ม Active Directory แบบกำหนดเองเพื่อที่ฉันสามารถตรวจสอบผู้ใช้กับสิ่งนี้ได้อย่างไร

ฉันได้ดูผลการค้นหามากมายแล้ว แต่ฉันกำลังดิ้นรนเพื่อค้นหาวิธีทางโปรแกรม (โดยใช้ C#) สร้างการอนุญาตที่กำหนดเองและกลุ่มที่กำหนดเองใน Active Directory

ฉันมีแอปพลิเคชันที่ต้องมีสิทธิ์ประมาณ 50 รายการ เช่น สามารถเข้ารหัสข้อมูล ถอดรหัสข้อมูล ส่งออกคีย์ส่วนตัว ลบคู่คีย์ได้ ฯลฯ การอนุญาตเหล่านี้จะถูกกำหนดให้กับกลุ่มที่กำหนดเอง ตัวอย่างเช่น กลุ่มอาจถูกเรียกว่า: ผู้ใช้มาตรฐาน ผู้จัดการความปลอดภัย ฯลฯ

ผู้ใช้จะได้รับมอบหมายกลุ่มเหล่านี้ตั้งแต่หนึ่งกลุ่มขึ้นไป ฉันต้องการให้จัดการทั้งหมดนี้ผ่าน Active Directory ซอฟต์แวร์ที่กำลังเขียนเป็นภาษา C# ผู้ใช้จะอยู่ใน Active Directory

ซอฟต์แวร์จะตรวจสอบว่าผู้ใช้มีสิทธิ์เฉพาะเมื่อมีการเรียกใช้ฟังก์ชันในแอปพลิเคชัน หากผู้ใช้ไม่ได้รับอนุญาต พวกเขาจะต้องป้อนการแทนที่ การแทนที่นี้เป็นเพียงการแจ้งข้อมูลรับรองของผู้ใช้รายอื่นที่มีสิทธิ์ที่เกี่ยวข้อง

ฉันต้องการเน้นย้ำว่าสิ่งนี้จำเป็นต้องได้รับการจัดการผ่าน Active Directory เนื่องจากซอฟต์แวร์ทำงานบนโดเมนและการอนุญาตจะได้รับการจัดการโดยผู้ดูแลระบบโดเมน

ด้วยเหตุนี้ ฉันจึงเชื่อว่าฟังก์ชันการทำงานของ ASP.Net Roles ยังไม่เพียงพอใช่หรือไม่ นอกจากนี้ ฉันไม่แน่ใจว่า Azure AD เหมือนกับ Windows AD หรือไม่

ฉันขอขอบคุณคำแนะนำเป็นอย่างยิ่งว่า. NET Assembly/namespace ใดที่จะให้ความสามารถดังต่อไปนี้:

  • สร้างการอนุญาต
  • สร้างกลุ่ม
  • กำหนดสิทธิ์ให้กับกลุ่ม
  • กำหนดผู้ใช้ให้กับกลุ่ม
  • ลบผู้ใช้ออกจากกลุ่ม
  • ลบการอนุญาตออกจากกลุ่ม

ฉันต้องทำสิ่งนี้โดยทางโปรแกรมเนื่องจากซอฟต์แวร์จะมีตัวติดตั้งและจะต้องรับผิดชอบในการเพิ่มสิทธิ์และกลุ่มที่กำหนดเองเฉพาะแอปพลิเคชันในระหว่างการติดตั้งหากไม่มีอยู่

อาจเป็นไปได้ว่าฉันกำลังเข้าใกล้สิ่งนี้ผิด ดังนั้นฉันจึงเปิดรับข้อเสนอแนะเป็นอย่างอื่น ตราบใดที่ฉันสามารถดำเนินการข้างต้นได้ก็เยี่ยมมาก!

ขอบคุณ!


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
เนื่องจากคุณให้ข้อมูลถูกต้องเป็นส่วนใหญ่และให้ข้อมูลมามากแล้ว ฉันจะยอมรับคำตอบ โปรดอัปเดตคำตอบหากคุณพบข้อมูลเกี่ยวกับวิธีการเพิ่ม accessrule ให้กับกลุ่ม - person SolidRegardless; 20.07.2018
comment
ฉันดีใจที่ได้ยินจากคุณ ใช่ ฉันพบวิธีแก้ปัญหาแล้ว ฉันจะอัปเดตเร็วๆ นี้ เพราะตอนนี้ฉันออกจากออฟฟิศแล้ว :) - person er-sho; 20.07.2018

คุณกำลังพยายามใช้ AD เป็นทั้งที่เก็บ AuthZ และกลไก AuthZ ของคุณหากฉันทำตามคำถามอย่างถูกต้อง แบบแรก (ใช้เป็นที่เก็บข้อมูล) สมเหตุสมผลดี แต่ฉันไม่คิดว่านี่เป็นเครื่องมือที่เหมาะสมในการประเมินการเข้าถึงแอปของคุณ

สิ่งที่ฉันจะทำคือแบ่งกลุ่มของคุณออกเป็นสองระดับ:

  • ระดับ 1 - กลุ่มสิทธิ์ (เช่น สามารถเข้ารหัสได้ สามารถถอดรหัสได้ ฯลฯ)

  • ระดับ 2 - บทบาท - เป็นสมาชิกของกลุ่มสิทธิ์ต่างๆ และในทางกลับกัน ผู้ใช้จะถูกเพิ่มในกลุ่มเหล่านี้เพื่อให้สิทธิ์แก่พวกเขา พวกเขาจะสืบทอดสิทธิ์ที่บทบาทมีเมื่อโทเค็นการเข้าสู่ระบบถูกสร้างขึ้นโดย Windows

สมมติว่าแอปของคุณใช้ Windows Authentication 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 ได้ ด้วย UI แอปพลิเคชันแบบกำหนดเอง การควบคุมนี้จึงเป็นไปได้ - person SolidRegardless; 27.07.2018
comment
นอกจากนี้ ฉันต้องตรวจสอบด้วย แต่ฉันหวังว่าจะสามารถดูกฎการเข้าถึงได้ภายในออบเจ็กต์ GroupPrincipal อาจใช้คุณสมบัติ ObjectSecurity ดูเหมือนว่าคำแนะนำข้างต้นจะทำให้กฎการเข้าถึงอยู่ห่างจากการตรวจสอบ AD ตามปกติ เนื่องจากไม่ได้เกี่ยวข้องกับสิ่งอื่นใดนอกจากแอปพลิเคชัน การเก็บไว้ใน AD ยังหมายความว่าสิทธิ์เดียวกันกับกลุ่มนั้นอยู่ในโดเมนการซิงค์สำหรับอินสแตนซ์อื่นๆ ของแอปพลิเคชันเดียวกัน (เช่น ในกล่องอื่น) - person SolidRegardless; 27.07.2018
comment
คุณสมบัติ ObjectSecurity ให้ ACL สำหรับกลุ่มนั้นแก่คุณ สิ่งนี้กำหนดสิทธิ์ในการดำเนินการกับกลุ่มใน AD เมื่อพิจารณาจากคำอธิบายของคุณเกี่ยวกับความจำเป็นในการซิงค์สิ่งนี้ สิ่งที่ฉันจะพิจารณาคือการสร้างพาร์ติชันแอปพลิเคชันแบบกำหนดเองใน AD พร้อมด้วยสคีมาแบบกำหนดเองเพื่อแสดงโมเดลข้อมูลของคุณ คุณสามารถใช้กลุ่มความปลอดภัยเพื่อกำหนดสิทธิ์และเชื่อมโยงไปยังคำจำกัดความของสิทธิ์ที่จัดเก็บไว้ในพาร์ติชันแอปได้ คุณจะให้สิทธิ์แอปของคุณเข้าถึงเพื่อแก้ไขข้อมูลนั้นและมี UI ในแอปสำหรับจัดการข้อมูล - 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