Bagaimana cara membuat izin dan grup Direktori Aktif khusus sehingga saya dapat memverifikasi pengguna terhadap hal ini?

Saya telah melihat banyak hasil pencarian tetapi saya kesulitan menemukan cara untuk secara terprogram (menggunakan C#) membuat izin khusus dan grup khusus di Direktori Aktif.

Saya memiliki aplikasi yang memerlukan sekitar 50 izin individual, seperti: dapat mengenkripsi data, dapat mendekripsi data, dapat mengekspor kunci pribadi, dapat menghapus pasangan kunci, dll. Izin ini akan diberikan ke grup khusus. Misalnya, grup tersebut dapat disebut: pengguna standar, manajer keamanan, dll.

Pengguna akan ditetapkan ke satu atau lebih grup ini. Saya memerlukan semua ini untuk dikelola melalui Direktori Aktif. Perangkat lunak yang sedang ditulis dalam C#. Pengguna akan berada di Direktori Aktif.

Perangkat lunak akan memeriksa apakah pengguna memiliki izin tertentu ketika suatu fungsi pada aplikasi akan dijalankan. Jika pengguna tidak memiliki izin maka mereka akan diminta untuk memasukkan override. Penggantian ini hanyalah sebuah permintaan untuk kredensial pengguna lain yang TIDAK memiliki izin yang relevan.

Saya ingin menekankan bahwa ini perlu dikelola melalui Direktori Aktif karena perangkat lunak berjalan di domain dan izinnya akan dikelola oleh Administrator Domain.

Karena itu, saya yakin fungsionalitas Peran ASP.Net tidak cukup? Selain itu, saya tidak yakin apakah Azure AD sama dengan Windows AD.

Saya akan sangat menghargai panduan apa pun mengenai perakitan/namespace .NET mana yang akan memberikan kemampuan berikut:

  • Buat izin
  • Membuat grup
  • Tetapkan izin ke grup
  • Tetapkan pengguna ke grup
  • Hapus pengguna dari grup
  • Hapus izin dari grup

Saya perlu melakukan ini secara terprogram karena perangkat lunak akan memiliki penginstal dan akan bertanggung jawab untuk menambahkan izin dan grup khusus khusus aplikasi selama instalasi jika belum ada.

Mungkin saja saya melakukan pendekatan yang salah, jadi saya terbuka terhadap saran sebaliknya. Selama saya bisa melakukan hal di atas maka bagus!

Terima kasih!


person SolidRegardless    schedule 20.07.2018    source sumber


Jawaban (2)


Seperti yang saya pahami,

Di sini Anda dapat mencoba kode di bawah ini

Coba sekali

1) Buat Grup

                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) Tambahkan Pengguna Ke Grup

            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) Hapus Pengguna Dari Grup

                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) Tambah atau Hapus AccessRule (Izin) ke Grup

Dari sisi saya, saya tidak tahu jelas tentang apa sebenarnya logika atau implementasi Anda,

Namun disini saya mencoba memberikan solusi untuk menambah atau menghapus aturan akses ke grup

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

Catatan: Harap uji semua kode di atas di lingkungan pengujian Anda terlebih dahulu.

person er-sho    schedule 20.07.2018
comment
Terima kasih atas petunjuk ini. Jika diinginkan, bagaimana cara memberikan izin khusus ke GroupPrincipal? - person SolidRegardless; 20.07.2018
comment
apakah kode di atas membantu Anda? izinkan saya memberikan waktu untuk menemukan kode di proyek saya - person er-sho; 20.07.2018
comment
Ya, benar, terima kasih. Jika saya dapat membuat dan memberikan izin ke grup ini, itu akan menyelesaikan pertanyaan saya secara keseluruhan. Saya menghargai waktu Anda. - person SolidRegardless; 20.07.2018
comment
bisakah Anda menjelaskan jenis izin apa yang ingin Anda atur? - person er-sho; 20.07.2018
comment
Contohnya adalah grup khusus yang disebut Pekerja Keamanan. Kelompok ini akan mampu melakukan sejumlah tugas. Tugas-tugas ini ditentukan oleh izin yang diberikan kepada grup tersebut. Setiap tugas akan memiliki izin terkait. Salah satu izin tersebut mungkin adalah Pengguna dapat mengekspor kunci pribadi dari pasangan kunci RSA. Izin lain mungkin agar Pengguna dapat mendekripsi data yang diimpor. Izin ini sepenuhnya khusus. Saya berasumsi bahwa hubungannya sedemikian rupa sehingga: Pengguna -› Grup -› Izin? - person SolidRegardless; 20.07.2018
comment
Silakan periksa jawabannya, Jika itu membantu maka terima jawaban hingga saya akan memeriksa proyek saya semua tentang izin. - person er-sho; 20.07.2018
comment
Poin izin adalah inti pertanyaan saya. Saya akan terus memantau dan segera setelah pertanyaan ini terjawab secara lengkap, saya akan menandai jawabannya sebagai selesai. Sekali lagi terima kasih atas bantuan Anda sejauh ini. - person SolidRegardless; 20.07.2018
comment
Apakah poin no 2 dan 3 berhasil? AD berisi AccessRule ke grup yang kita atur dengan Baca dan Tulis. Apakah Anda menginginkan AccessRule ini? - person er-sho; 20.07.2018
comment
Hai, saya yakin itu benar. Saya tidak yakin bagaimana menugaskannya ke grup. - person SolidRegardless; 20.07.2018
comment
Karena sebagian besar Anda benar dan telah memberikan banyak informasi, saya akan menerima jawabannya. Harap perbarui jawaban jika Anda menemukan informasi tentang cara menambahkan aturan akses ke grup. - person SolidRegardless; 20.07.2018
comment
Saya senang mendengar pendapat Anda. Ya, saya menemukan solusinya. Saya akan segera memperbaruinya karena sekarang saya berangkat dari kantor :) - person er-sho; 20.07.2018

Anda mencoba menggunakan AD sebagai toko AuthZ dan mesin AuthZ Anda jika saya mengikuti pertanyaan dengan benar. Yang pertama (menggunakannya sebagai penyimpanan data) sangat masuk akal, namun menurut saya ini bukan alat yang tepat untuk mengevaluasi akses aplikasi Anda.

Apa yang akan saya lakukan adalah melapisi grup Anda dalam dua tingkat:

  • Level 1 - grup izin (misalnya dapat mengenkripsi, dapat mendekripsi, dll.)

  • Level 2 - peran - ini adalah anggota dari berbagai grup izin, dan pada gilirannya pengguna ditambahkan ke grup ini untuk memberi mereka peran tersebut. Mereka akan mewarisi izin yang dimiliki peran tersebut ketika token masuk mereka dibuat oleh Windows.

Dengan asumsi aplikasi Anda menggunakan Otentikasi Windows, WindowsTokenRoleProvider (https://msdn.microsoft.com/en-us/library/system.web.security.windowstokenroleprovider(v=vs.110).aspx) akan memunculkan semua keanggotaan grup ke dalam aplikasi Anda dan Anda kemudian dapat memeriksa apakah seseorang berada dalam grup izin dan membiarkan mereka melakukan sesuatu (atau tidak)...

person Brian Desmond    schedule 25.07.2018
comment
Oke, saya mengerti maksud Anda. Masalahnya adalah izin (level 1) sangat rumit dan perlu ditetapkan secara dinamis ke grup (level 2). Pengguna dapat mengonfigurasi grup mana yang dapat melakukan apa menggunakan antarmuka pengguna aplikasi. Saya menyukai gagasan untuk memiliki grup level 1 dan level 2 karena mereka dapat dikelola melalui AD. Namun, bagaimana Anda dapat memastikan bahwa hanya grup tingkat 1 yang dapat ditugaskan ke tingkat 2? Dengan UI aplikasi khusus, kontrol ini dimungkinkan. - person SolidRegardless; 27.07.2018
comment
Juga, saya perlu memeriksanya, tetapi saya berharap aturan akses dapat dilihat dalam objek GroupPrincipal. Mungkin menggunakan properti ObjectSecurity. Sepertinya saran di atas akan menjauhkan aturan akses dari pembacaan AD biasa, karena aturan tersebut sebenarnya tidak mempedulikan apa pun selain aplikasi. Menyimpannya dalam AD juga berarti bahwa izin yang sama yang diterapkan pada grup berada dalam sinkronisasi seluruh domain untuk contoh lain dari aplikasi yang sama (yaitu pada kotak yang berbeda). - person SolidRegardless; 27.07.2018
comment
Properti ObjectSecurity memberi Anda ACL untuk grup itu sendiri. Ini mendefinisikan izin untuk melakukan operasi pada grup di AD. Mengingat uraian Anda tentang perlunya menjaga sinkronisasi ini, yang akan saya pertimbangkan adalah membuat partisi aplikasi khusus di AD bersama dengan beberapa skema khusus untuk mewakili model data Anda. Anda dapat menggunakan grup keamanan untuk menetapkan izin dan menautkannya ke definisi izin yang disimpan di partisi aplikasi. Anda akan memberikan akses kepada aplikasi Anda untuk mengubah data tersebut dan memiliki UI di aplikasi untuk mengelolanya. - person Brian Desmond; 28.07.2018
comment
Ya, itu terdengar masuk akal. Jika Anda memiliki referensi untuk melakukan ini, saya mungkin mempertimbangkan untuk mengubah jawaban terbaik atas saran Anda. Saya mencoba saran dari jawaban terbaik yang dipilih saat ini dan tidak berhasil. ObjectSecurity tampaknya tidak berfungsi dengan benar dan saya mengerti alasannya saat ini. - person SolidRegardless; 28.07.2018
comment
Tidak banyak, tapi ini ada beberapa tautan: docs. microsoft.com/en-us/windows/desktop/AD/ dan docs.microsoft.com/en-us/windows/desktop/AD/. Steker yang tidak tahu malu, buku saya Active Directory 5th Ed dari O'Reilly juga memiliki beberapa konten bagus dalam skemanya meskipun tidak banyak di partisi aplikasi. - person Brian Desmond; 29.07.2018