Kontrol akses berbasis peran (RBAC) vs. Kontrol akses berbasis klaim (CBAC) di ASP.NET MVC

147

Apa manfaat utama menggunakan CBAC vs RBAC ? Kapan lebih baik menggunakan CBAC dan kapan lebih baik menggunakan RBAC?

Saya mencoba memahami konsep umum model CBAC tetapi gagasan umum masih belum jelas bagi saya.

Tuan Pumpkin
sumber
1
Konsep-konsep ini juga masih sangat samar bagi saya. Mereka tampaknya melakukan hal yang sama juga. Yang satu hanya peran dengan nilai?
Zapnologica

Jawaban:

262

Saya akan mencoba menunjukkan bagaimana Anda bisa mendapat manfaat dari Kontrol Akses Berbasis Klaim dalam Konteks ASP.NET MVC.

Saat Anda menggunakan otentikasi berbasis Peran, jika Anda memiliki tindakan untuk membuat pelanggan dan Anda ingin agar orang-orang yang berada dalam peran 'Penjualan' dapat melakukan itu, maka Anda menulis kode seperti ini:

[Authorize(Roles="Sale")]
public ActionResult CreateCustomer()
{
    return View();
}

Kemudian, Anda menyadari bahwa, terkadang, orang-orang dari peran 'Pemasaran' harus dapat menciptakan Pelanggan. Kemudian, Anda memperbarui metode Tindakan Anda seperti itu

[Authorize(Roles = "Sale", "Marketing")]
public ActionResult CreateCustomer()
{
    return View();
}

Sekarang, Anda menyadari bahwa, beberapa orang pemasaran tidak boleh dapat menciptakan Pelanggan, tetapi tidak mungkin untuk menetapkan peran yang berbeda untuk orang-orang yang berada dalam Pemasaran. Jadi, Anda terpaksa mengizinkan semua orang pemasaran untuk menciptakan Pelanggan.

Anda melihat masalah lain, setiap kali Anda memutuskan bahwa orang-orang Pemasaran harus diizinkan untuk membuat pelanggan, Anda harus memperbarui semua metode Tindakan MVC Anda Atributkan otorisasi, kompilasi aplikasi Anda, uji dan penyebaran. Beberapa hari kemudian, Anda memutuskan, bukan pemasaran tetapi beberapa peran lain harus diizinkan untuk melakukan tugas itu, jadi Anda mencari di basis kode Anda dan menghapus semua 'Pemasaran' dari atribut Otorisasi dan menambahkan nama peran baru Anda di atribut Otorisasi ... Bukan solusi sehat. Pada titik itu, Anda akan menyadari perlunya Kontrol Akses Berbasis Izin.

Kontrol akses berbasis izin adalah cara menetapkan berbagai izin untuk berbagai pengguna dan memeriksa apakah pengguna memiliki izin untuk melakukan suatu tindakan dari kode dalam waktu berjalan. Setelah Anda menetapkan berbagai izin untuk berbagai pengguna, Anda menyadari bahwa Anda perlu mengizinkan beberapa pengguna untuk mengeksekusi beberapa kode jika pengguna memiliki beberapa properti seperti "Pengguna Facebook", "Pengguna lama" dll. Izinkan saya memberikan contoh. Katakanlah Anda ingin mengizinkan akses ke halaman tertentu jika pengguna login menggunakan Facebook. Sekarang, apakah Anda akan membuat izin 'Facebook' untuk pengguna itu? Tidak, 'Facebook' tidak terdengar seperti izin. Melakukannya ? Sebaliknya itu terdengar seperti klaim. Pada saat yang sama, Izin juga bisa terdengar seperti Klaim !! Jadi, lebih baik memeriksa klaim dan mengizinkan akses.

Sekarang, mari kembali ke contoh konkret kontrol akses berbasis klaim.

Anda dapat menetapkan beberapa rangkaian klaim seperti ini:

"CanCreateCustomer", "CanDeleteCustomer", "CanEditCustomer" .. dll.

Sekarang, Anda dapat menghias Metode Tindakan Anda seperti ini:

        [ClaimAuthorize(Permission="CanCreateCustomer")]
        public ActionResult CreateCustomer()
        {
            return View();
        }

(harap dicatat, [ClaimAuthorize (Izin = "CanCreateCustomer")] tidak boleh dibangun ke perpustakaan kelas MVC, saya hanya menunjukkan sebagai contoh, Anda dapat menggunakan beberapa perpustakaan kelas yang memiliki definisi kelas atribut seperti itu)

Sekarang, Anda dapat melihat bahwa, metode tindakan CreateCustomer akan selalu membutuhkan izin 'CanCreateCustomer' dan tidak akan pernah berubah atau sulit berubah. Jadi, di database Anda, Anda membuat tabel izin (klaim) dan hubungan izin pengguna. Dari panel admin Anda, Anda dapat mengatur izin (klaim) untuk setiap pengguna yang dapat melakukan apa. Anda dapat memberikan izin (klaim) 'CanCreateCustomer' kepada siapa pun yang Anda suka dan hanya pengguna yang diizinkan yang dapat membuat pelanggan dan pengguna yang diizinkan hanya dapat membuat pelanggan dan tidak ada yang lain (kecuali Anda menetapkan izin lain untuk pengguna yang sama).

Model keamanan ini menawarkan Anda praktik kode bersih. Selain itu, ketika Anda menulis Metode Tindakan Anda, Anda tidak perlu berpikir tentang siapa yang dapat menggunakan metode ini, tetapi Anda selalu dapat yakin bahwa siapa pun yang menggunakan metode ini akan memiliki izin (klaim) yang tepat yang diberikan oleh Admin. Kemudian, Admin dapat memutuskan siapa yang dapat melakukan apa. Bukan Anda sebagai pengembang. Itulah bagaimana logika bisnis Anda dipisahkan dari logika Keamanan.

Setiap kali seseorang masuk, aplikasi Anda akan memeriksa izin apa pun yang tersedia untuk pengguna itu dan bahwa izin (klaim) akan tersedia sebagai properti tambahan dari pengguna yang saat ini masuk (biasanya set klaim disimpan sebagai cookie untuk pengguna yang masuk), jadi Anda tidak perlu memeriksa izin yang ditetapkan sepanjang waktu dari basis data. Intinya adalah, Anda mendapatkan lebih banyak kontrol dari logika keamanan Anda dalam aplikasi Anda jika Anda menerapkan akses berbasis klaim daripada akses berbasis peran. Bahkan, Peran juga dapat dianggap sebagai Klaim.

Jika aplikasi Anda adalah aplikasi yang sangat kecil di mana hanya akan ada 2 peran: Pelanggan dan Admin dan tidak ada kemungkinan bahwa Pelanggan akan dapat melakukan hal lain selain apa yang seharusnya mereka lakukan dalam aplikasi Anda, maka mungkin, berdasarkan Peran kontrol akses akan melayani tujuan tersebut, tetapi seiring pertumbuhan aplikasi Anda, Anda akan mulai merasakan kebutuhan kontrol akses berbasis klaim di beberapa titik.

Emran Hussain
sumber
10
Yang saya bingung tentang bagaimana Peran faktor dalam klaim - tidak dalam peran sistem berbasis klaim pada dasarnya pengelompokan klaim sehingga Anda dapat secara massal menetapkan hal-hal? mis. Anda dapat mengatakan Bob berperan sebagai Pemasaran dan semua orang di Pemasaran memiliki klaimCanCreateCustomer, CanViewAdCampaigns
George Mauer
9
Wow, saya sudah mencoba mencari tahu bagaimana semua klaim ini bekerja tetapi saya TIDAK PERNAH memahami semua penjelasan dan contoh abstrak yang tidak jelas. Pos Anda adalah yang pertama membuka pikiran saya dan menyampaikan pesan. Terima kasih banyak untuk menjelaskannya dengan singkat.
Leon Cullens
3
Ini adalah penjelasan yang sangat bijaksana, tetapi saya pikir Anda menyadari bahwa itu tidak lengkap dengan komentar Anda "Perbedaannya terletak pada konsep, bukan teknologi." Sebenarnya ada perbedaan dalam teknologi, yang tidak dijawab oleh jawaban ini. Singkatnya, saya tidak setuju bahwa itu tergantung pada bagaimana Anda mendefinisikan Peran sebagai dua teknologi memenuhi persyaratan yang sangat berbeda. Saya ragu untuk menawarkan koreksi karena jawabannya sendiri sangat membantu dalam menunjukkan jebakan yang terkait dengan penerapan peran otorisasi (atau klaim) yang terlalu luas. Sayangnya itu bukan pertanyaan yang diajukan.
rami
6
Misalkan saya menginginkannya seperti ini: 1) "Izin" adalah hak untuk melakukan satu tindakan sederhana, seperti "Buat pelanggan". Nama izin dimulai dengan "can" - CanCreateCustomer. Nama-nama izin 'hardcoded' dalam kode sumber aplikasi. 2) Seorang pengguna dapat diberi satu set izin - tetapi tidak secara langsung. Pengguna menerima izin hanya melalui peran. 3) Peran adalah seperangkat izin, tidak lebih. Beberapa pengguna akhir (admin) dapat secara dinamis membuat peran khusus baru dengan izin yang ditetapkan secara sewenang-wenang (dipilih dari daftar tetap). Pertanyaannya adalah: BISAKAH SAYA MELAKUKANNYA SEPERTI INI dengan model berbasis klaim?
Dmitry Arestov
7
Dokumentasi Microsoft mengatakan: Klaim adalah pasangan nilai nama yang mewakili apa subjeknya, bukan apa yang bisa dilakukan subjek.
CodingSoft
61

Saya telah menerapkan model keamanan berkali-kali sekarang dan harus membungkus kepala saya dengan konsep-konsep ini juga. Setelah melakukannya berkali-kali, inilah pemahaman saya tentang konsep-konsep ini.

Apa Peran Itu?

Peran = Serikat Pengguna dan Izin.

Di satu sisi, Peran adalah kumpulan Izin. Saya suka menyebutnya Profil Izin. Ketika mendefinisikan Peran Anda pada dasarnya menambahkan sekelompok Izin ke Peran itu sehingga dalam arti Peran adalah Profil Izin.

Di sisi lain, Peran juga merupakan kumpulan Pengguna. Jika saya menambahkan Bob dan Alice ke Peran "Manajer" maka "Manajer" sekarang berisi kumpulan dua jenis Pengguna seperti Grup.

Yang benar adalah bahwa Peran adalah KEDUA kumpulan Pengguna dan koleksi Izin yang disatukan. Secara visual ini dapat dilihat sebagai diagram Venn.

Apa itu Grup?

Grup = Pengumpulan Pengguna

"Grup" hanyalah kumpulan Pengguna. Perbedaan antara Grup dan Peran adalah bahwa Peran juga memiliki koleksi Izin tetapi Grup hanya memiliki koleksi Pengguna.

Apa itu Izin?

Izin = Apa yang bisa dilakukan subjek

Apa itu Set Izin

Set Izin = Kumpulan Izin

Dalam sistem RBAC yang kuat, Izin juga dapat dikelompokkan seperti Pengguna. Sedangkan Grup adalah kumpulan Pengguna saja, Set Izin adalah koleksi Izin saja. Ini memungkinkan administrator untuk menambahkan seluruh koleksi Izin ke Peran sekaligus.

Bagaimana Pengguna, Grup, Peran, dan Izin Bersatu

Dalam sistem RBAC yang kuat, Pengguna dapat ditambahkan ke Peran satu per satu untuk membuat kumpulan Pengguna di Peran atau Grup dapat ditambahkan ke Peran untuk menambahkan koleksi Pengguna ke Peran sekaligus. Either way, Peran mendapatkan koleksi Pengguna yang ditambahkan secara individual atau dengan menambahkan Grup ke Peran atau dengan menambahkan campuran Pengguna dan Grup ke Peran. Izin dapat dipikirkan dengan cara yang sama.

Izin dapat ditambahkan ke Peran secara individual untuk membuat koleksi Izin di dalam Peran atau Set Izin dapat ditambahkan ke Peran. Akhirnya, campuran Izin dan Izin dapat ditambahkan ke Peran. Bagaimanapun, Peran mendapatkan koleksi Izinnya dari ditambahkan secara individual atau dengan menambahkan Set Izin ke Peran.

Seluruh tujuan Peran adalah untuk mengawinkan Pengguna dengan Izin. Oleh karena itu, Peran adalah UNI Pengguna dan Izin.

Apa itu Klaim?

Klaim = Apa Subjek "adalah"

Klaim BUKAN Izin. Sebagaimana ditunjukkan dalam jawaban sebelumnya, Klaim adalah apa yang subjek "adalah" bukan apa yang "dapat dilakukan" subjek.

Klaim tidak menggantikan Peran atau Izin, itu adalah bagian informasi tambahan yang dapat digunakan seseorang untuk membuat keputusan Otorisasi.

Kapan Menggunakan Klaim

Saya telah menemukan Klaim berguna ketika keputusan Otorisasi perlu dibuat ketika Pengguna tidak dapat ditambahkan ke Peran atau keputusan tidak didasarkan pada asosiasi Pengguna untuk Izin. Contoh Pengguna Facebook yang menyebabkan hal ini. Pengguna Facebook mungkin bukan seseorang yang ditambahkan ke "Peran" ... mereka hanyalah beberapa Pengunjung yang diautentikasi melalui Facebook. Meskipun tidak cocok dengan RBAC, itu adalah sepotong informasi untuk membuat keputusan otorisasi.

@CodingSoft menggunakan metafora klub malam dalam jawaban sebelumnya, yang ingin saya sampaikan. Dalam jawaban itu, Surat Ijin Mengemudi digunakan sebagai contoh yang berisi satu set Klaim di mana Tanggal Lahir mewakili salah satu Klaim dan nilai Klaim DateOfBirth digunakan untuk menguji terhadap aturan otorisasi. Pemerintah yang menerbitkan Surat Ijin Mengemudi adalah otoritas yang memberikan keaslian Klaim. Oleh karena itu, dalam skenario klub malam, penjaga pintu melihat Surat Izin Mengemudi orang tersebut, memastikan bahwa kartu tersebut dikeluarkan oleh otoritas yang tepercaya dengan memeriksa apakah itu merupakan kartu identitas palsu (yaitu kartu identitas yang dikeluarkan oleh pemerintah yang sah), kemudian lihat Tanggal Lahir (salah satu dari banyak klaim tentang Surat Ijin Mengemudi), kemudian gunakan nilai itu untuk menentukan apakah orang tersebut cukup umur untuk memasuki klub. Jika begitu,

Sekarang, dengan dasar itu dalam pikiran saya ingin sekarang memperluas itu lebih jauh. Misalkan bangunan tempat klub malam itu berisi kantor, kamar, dapur, lantai lain, lift, ruang bawah tanah, dll. Di mana hanya karyawan klub bisa masuk. Selain itu, karyawan tertentu mungkin memiliki akses ke tempat-tempat tertentu yang mungkin tidak dimiliki karyawan lain. Misalnya, Manajer mungkin memiliki akses ke lantai kantor di atas yang tidak dapat diakses karyawan lain. Dalam hal ini ada dua Peran. Manajer dan Karyawan.

Sementara akses pengunjung ke area klub malam publik disahkan oleh satu klaim seperti dijelaskan di atas, karyawan memerlukan akses oleh Peran ke ruang terbatas non-publik lainnya. Bagi mereka, SIM tidak cukup. Yang mereka butuhkan adalah Lencana Karyawan yang mereka pindai untuk masuk. Di suatu tempat ada sistem RBAC yang memberikan lencana di akses Peran Manajer ke lantai atas, dan lencana di akses Peran Karyawan ke kamar lain.

Jika karena alasan apa pun kamar tertentu perlu ditambahkan / dihapus oleh Peran, ini dapat dilakukan dengan menggunakan RBAC, tetapi itu tidak cocok untuk Klaim.

Izin dalam Perangkat Lunak

Pengodean Peran ke dalam aplikasi adalah ide yang buruk. Hard ini mengkode tujuan Peran ke dalam aplikasi. Apa yang harus dimiliki aplikasi hanyalah Izin yang berfungsi seperti Bendera Fitur. Di mana Bendera Fitur dapat diakses dengan konfigurasi, Izin dibuat dapat diakses oleh Konteks Keamanan Pengguna yang diperoleh dari koleksi PERBEDAAN Izin yang dikumpulkan dari semua Peran yang telah ditempatkan oleh Pengguna. Inilah yang saya sebut "Izin Efektif." Aplikasi seharusnya hanya menyajikan menukemungkinan Izin untuk fitur / tindakan. Sistem RBAC harus melakukan pekerjaan mengawinkan Izin tersebut kepada Pengguna melalui Peran. Dengan cara ini, tidak ada pengodean keras Peran dan satu-satunya waktu Izin berubah adalah ketika dihapus atau yang baru ditambahkan. Setelah Izin ditambahkan ke perangkat lunak itu tidak boleh diubah. Ini hanya boleh dihapus bila perlu (yaitu ketika fitur dihentikan dalam versi baru) dan hanya yang baru yang dapat ditambahkan.

Satu catatan terakhir.

Hibah vs Deny

Sistem RBAC yang kuat dan bahkan sistem CBAC harus membedakan antara Hibah dan Bantahan.

Menambahkan Izin ke Peran harus disertai dengan GRANT atau DENY. Ketika Izin diperiksa, semua Izin GRANTed harus ditambahkan ke daftar Pengguna Izin Efektif. Kemudian setelah semua yang dilakukan, daftar Izin DENIED harus menyebabkan sistem untuk menghapus Izin tersebut dari daftar Izin Efektif.

Ini memungkinkan administrator untuk "mengubah" Izin akhir suatu subjek. Yang terbaik adalah jika Izin juga dapat ditambahkan ke Pengguna secara langsung. Dengan cara ini, Anda dapat menambahkan Pengguna ke Peran Manajer dan mereka mendapatkan akses ke segalanya, tetapi mungkin Anda ingin MENYANGKAL akses ke Lady's Restroom karena Pengguna adalah laki-laki. Jadi Anda menambahkan Pengguna laki-laki ke Peran Manajer, dan menambahkan Izin ke objek Pengguna dengan DENY sehingga hanya mengambil akses kamar Lady itu.

Sebenarnya, ini akan menjadi kandidat yang baik untuk Klaim. Jika Pengguna memiliki Klaim "jenis kelamin = laki-laki", maka berada di Peran Manajer memberikan akses ke semua kamar tetapi kamar kecil Lady juga membutuhkan Klaim jenis kelamin = perempuan dan toilet pria membutuhkan Klaim jenis kelamin = laki-laki. Dengan cara ini orang tidak perlu mengonfigurasi izin DENY untuk Pengguna laki-laki karena penegakan Klaim menangani itu untuk semua orang dengan aturan otorisasi tunggal. Namun, itu bisa dilakukan dengan cara apa pun.

Intinya adalah bahwa dengan DENIAL of Izin itu membuat pengelolaan Peran lebih mudah karena pengecualian dapat diterapkan.

Di bawah ini adalah diagram yang saya buat sejak lama yang menunjukkan model RBAC. Saya tidak memiliki grafik untuk Klaim tetapi Anda dapat membayangkan itu hanya atribut yang melekat pada Pengguna di mana pun mereka berada. Juga, diagram tidak menunjukkan Grup (saya perlu memperbaruinya di beberapa titik).

Saya harap ini membantu.

Ini adalah Diagram dari RBAC yang Diuraikan Di Atas

Pembaruan pada 7 April 2019 Berdasarkan umpan balik dari @Brent (terima kasih) ... menghapus referensi yang tidak perlu untuk jawaban sebelumnya dan menjelaskan dasar asli dari metafora "klub malam" yang disediakan oleh @CodingSoft untuk membuat jawaban ini dapat dipahami tanpa harus untuk membaca jawaban lain.

Ricardo
sumber
3
Ini adalah penjelasan yang bagus yang harus diunggulkan ke atas, terima kasih telah menambahkan contoh dan diagram.
Optimae
1
Jawaban yang bagus Satu rekomendasi akan menghapus referensi ke jawaban lain. Setiap jawaban harus berdiri sendiri, dan meskipun saya membaca jawaban yang lain, tidak semua orang mau.
Brent
Brent terima kasih. Ide yang hebat. Saya menyapu jawaban dan mencoba memperbaikinya dengan menghapus referensi yang tidak perlu untuk jawaban lain dan dengan menjelaskan dasar metafora klub malam sehingga tidak perlu membaca jawaban yang lain. Jika Anda memiliki saran lebih lanjut untuk perbaikan, saya akan dengan senang hati menerapkannya. Terima kasih lagi.
Ricardo
Setuju, ini harus menjadi jawaban teratas. Ada jawaban bagus lainnya, tetapi jawaban ini jelas, terlengkap, dan tepat.
Matija Han
ini luar biasa dan dijelaskan dalam bahasa normal yang luar biasa - terima kasih
mainan
49

Saya tidak sepenuhnya setuju dengan jawaban Emran

[Authorize(Roles="Sale")]

Naif

Pertanyaannya adalah bagaimana

  [Authorize(Roles="CustomerCreator")]

berbeda dengan

 [ClaimAuthorize(Permission="CanCreateCustomer")]

Jika keduanya sama-sama bagus, mengapa kita perlu klaim?

Saya pikir karena

Konsep klaim lebih umum dibandingkan dengan Peran

Dalam konteks contoh di atas kita dapat mengatakan "CustomerCreator" adalah klaim tipe "peran" yang disediakan oleh "Asp.NETroleProvider"

Contoh-contoh klaim tambahan.

  1. "AAA" adalah klaim tipe "MYExamSite.Score" yang disediakan oleh "MYExamSite.com"

  2. "Emas" adalah klaim tipe "MYGYM.Membershiptype" yang disediakan oleh "MYGYMApp"

Pushpendra
sumber
8
Saya pikir jawaban ini memiliki nilai karena membahas perbedaan mendasar antara klaim dan perannya yang setara, daripada menggambarkan skenario yang dapat diimplementasikan secara efektif menggunakan model otorisasi berbasis klaim atau peran. +1
Katstevens
1
Saya telah mengirim komentar pada jawaban saya. Saya katakan, itu tergantung pada bagaimana Anda mendefinisikan "peran" dalam organisasi Anda. Anda dapat mendefinisikan Peran yang terdengar seperti Izin / atau klaim. Pendekatan itu tidak akan menghentikan Anda mencapai tujuan yang sama. PERAN biasanya berarti "Penunjukan"; Begitulah istilah yang digunakan digunakan. Perbedaannya terletak pada konsep, bukan teknologi. Jika Anda menggunakan [Otorisasi (Peran = "CustomerCreator")], maka itu akan mirip dengan CBAC dalam arti abstrak. Debatnya adalah tentang apakah Anda harus membuat Perjanjian atau Izin Mico dalam model keamanan Anda. Klaim Bukan hanya tentang Izin, ia menawarkan lebih banyak.
Emran Hussain
Ini adalah bagaimana peran dilakukan dalam MSSQL. memiliki DBDataReader dan DBDataWriter bukan MyAppDB dan HisAppDB.
Behrooz
Bagaimana peran berarti pengangkatan? Dalam RBAC, Peran diberikan dengan izin.
Wouter
46

Jawaban yang diterima tampaknya menempatkan Peran sebagai objek tumpul dan Klaim sebagai alat yang fleksibel, tetapi sebaliknya membuatnya tampak hampir identik. Sayangnya, penentuan posisi ini tidak sesuai dengan konsep klaim dan pada dasarnya mencerminkan sedikit kesalahpahaman tentang tujuan mereka.

Peran ada dan masuk akal hanya dalam ruang lingkup implisit. Umumnya itu adalah ruang lingkup aplikasi atau organisasi (yaitu Peran = Administrator). Klaim, di sisi lain, dapat 'dibuat' oleh siapa saja. Misalnya, otentikasi Google dapat menghasilkan klaim termasuk "email" pengguna, sehingga melampirkan email itu ke suatu identitas. Google membuat klaim, aplikasi memilih apakah akan memahami dan menerima klaim itu. Aplikasi itu sendiri selanjutnya dapat melampirkan klaim yang disebut "metode otentikasi" (seperti ASP.NET MVC Core Identity) dengan nilai "Google". Setiap klaim mencakup ruang lingkup sehingga memungkinkan untuk mengidentifikasi apakah klaim memiliki makna secara eksternal, lokal, atau keduanya (atau lebih berbutir halus sesuai kebutuhan.)

Poin kuncinya adalah bahwa semua klaim secara eksplisit dilampirkan pada identitas dan termasuk ruang lingkup yang eksplisit. Klaim-klaim itu tentu saja dapat digunakan untuk otorisasi - dan ASP.NET MVC menyediakan dukungan untuk itu melalui atribut Otorisasi, tetapi itu bukan satu-satunya atau bahkan tujuan utama Klaim. Ini tentu tidak membedakannya dari Peran, yang dapat digunakan dengan cara yang persis sama untuk otorisasi lingkup lokal.

Jadi seseorang dapat memilih untuk menggunakan Peran, atau Klaim, atau keduanya untuk tujuan otorisasi dan kemungkinan tidak menemukan keuntungan atau kerugian yang melekat pada keduanya, asalkan Peran dan Klaim tersebut dicakup secara lokal. Tetapi jika, misalnya, otorisasi tergantung pada klaim identitas eksternal, maka Peran tidak akan memadai. Anda harus menerima klaim eksternal dan menerjemahkannya ke peran yang dicakup secara lokal. Tidak selalu ada yang salah dengan itu, tetapi memperkenalkan lapisan tipuan dan membuang konteks.

rami
sumber
3
Jawaban yang bagus ... Saya pikir saya mengerti Anda ..., tetapi akan lebih jelas jika Anda dapat memberikan beberapa contoh nyata (mungkin dalam konteks ASP MVC) ... jawabannya terlalu abstrak. Saya kesulitan membungkus kepala saya di sekitarnya.
Rosdi Kasim
2
Paragraf kedua mencakup contoh konkret yang terkait dengan ASP.NET MVC Core Identity dan otentikasi Google. Kedengarannya seperti langkah-lebih rinci dari model baru Core akan membantu - untuk itu saya merekomendasikan artikel ini: andrewlock.net/introduction-to-authentication-with-asp-net-core
rami
Jawaban terbaik IMHO
mrmashal
8

Secara lebih luas, Anda harus mempertimbangkan kontrol akses berbasis atribut (ABAC). RBAC dan ABAC keduanya konsep yang didefinisikan oleh NIST, Institut Nasional Standar dan Teknologi. CBAC, di sisi lain, adalah model yang didorong oleh Microsoft yang sangat mirip dengan ABAC.

Baca lebih lanjut di sini:

David Brossard
sumber
3
Sementara rekomendasi untuk menggunakan kontrol akses berbasis atribut bagus. Tautan ke praktik umum / terbaik menerapkan ini di tumpukan MVC / WebAPI akan lebih baik. Terima kasih
Itanex
6

Dasar antara RBAC dan CBAC adalah:

RBAC : seorang pengguna harus ditugaskan ke peran yang diizinkan untuk melakukan suatu tindakan.

CBAC : pengguna harus memiliki klaim dengan nilai yang benar, seperti yang diharapkan oleh aplikasi, untuk diotorisasi. Kontrol akses berbasis klaim elegan untuk ditulis dan lebih mudah dirawat.

Selain itu klaim dikeluarkan ke aplikasi oleh layanan otorisasi yang menerbitkan (Token Layanan Keamanan STS) yang dipercaya oleh aplikasi Anda (Mengandalkan Pihak)

Benjamin Nguyen
sumber
6

Peran hanyalah satu jenis Klaim. Seperti itu, mungkin ada banyak jenis klaim lain, misalnya nama pengguna adalah salah satu jenis klaim

Venkat Naidu
sumber
6

Penting untuk terlebih dahulu menganalisis apa yang diperlukan untuk Otentikasi sebelum memutuskan metode mana yang terbaik. Dari dokumentasi Microsoft di bawah ini, disebutkan "Klaim bukanlah yang dapat dilakukan subjek. Misalnya, Anda mungkin memiliki SIM, dikeluarkan oleh otoritas SIM setempat. Lisensi pengemudi Anda memiliki tanggal lahir Anda di dalamnya. Dalam hal ini nama klaim adalah DateOfBirth, nilai klaim akan menjadi tanggal lahir Anda, misalnya 8 Juni 1970 dan penerbit akan menjadi otoritas SIM, otorisasi berbasis klaim, paling sederhana, memeriksa nilai klaim dan memungkinkan akses ke sumber daya berdasarkan nilai itu. Misalnya jika Anda ingin akses ke klub malam proses otorisasi mungkin: 6 "

Dari contoh ini kita dapat melihat bahwa mengakses klub dekat dengan Otorisasi Berbasis Klaim dihentikan berbeda dari jenis Otorisasi yang akan diminta oleh staf yang bekerja di klub malam, dalam hal ini staf klub malam akan membutuhkan Otorisasi berbasis Peran yang tidak diperlukan untuk pengunjung klub malam karena pengunjung klub malam semua memiliki tujuan yang sama di klub malam maka dalam situasi ini Otorisasi Berbasis Klaim cocok untuk pengunjung klub malam.

Otorisasi berbasis peran https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles 10/14/2016 Ketika sebuah identitas dibuat, itu mungkin milik satu atau lebih peran. Sebagai contoh, Tracy dapat menjadi milik Administrator dan peran Pengguna sementara Scott mungkin hanya milik peran Pengguna. Bagaimana peran ini dibuat dan dikelola tergantung pada backing store dari proses otorisasi. Peran diekspos ke pengembang melalui metode IsInRole pada kelas ClaimsPrincipal.

Otorisasi Berbasis Klaim https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims 10/14/2016 Ketika suatu identitas dibuat, dapat diberikan satu atau lebih klaim yang dikeluarkan oleh pihak yang dipercaya. Klaim adalah pasangan nilai nama yang merepresentasikan subjek, bukan apa yang bisa dilakukan subjek. Misalnya, Anda mungkin memiliki SIM, dikeluarkan oleh otoritas SIM setempat. SIM Anda memiliki tanggal lahir Anda di atasnya. Dalam hal ini nama klaim adalah DateOfBirth, nilai klaim akan menjadi tanggal lahir Anda, misalnya 8 Juni 1970 dan penerbitnya akan menjadi otoritas SIM. Otorisasi berdasarkan klaim, paling sederhana, memeriksa nilai klaim dan memungkinkan akses ke sumber daya berdasarkan nilai itu. Misalnya jika Anda ingin akses ke klub malam, proses otorisasi mungkin:

Petugas keamanan pintu akan mengevaluasi nilai tanggal klaim kelahiran Anda dan apakah mereka mempercayai penerbit (otoritas SIM) sebelum memberikan Anda akses.

Identitas dapat berisi banyak klaim dengan banyak nilai dan dapat berisi banyak klaim dari jenis yang sama.

CodingSoft
sumber
2

Dimungkinkan juga untuk mengelola peran dengan cara klaim.

Alih-alih membuat peran otorisasi yang mencerminkan peran bisnis, buat peran yang mencerminkan peran tindakan, misalnya CreateCustomer, EditCustomer, DeleteCustomer. Beri anotasi metode yang diperlukan.

Bukan hal yang mudah untuk memetakan individu ke satu set peran tindakan, terutama karena daftar peran semakin besar. Oleh karena itu, Anda harus mengelola peran bisnis pada tingkat granularitas yang lebih rendah (mis. Penjualan, Pemasaran) dan memetakan Peran bisnis ke peran tindakan yang diperlukan. Yaitu, tambahkan pengguna ke peran bisnis dan memetakan mereka ke peran (tindakan) yang diperlukan dalam tabel otorisasi yang ada.

Anda bahkan dapat mengganti peran bisnis dan menambahkan seseorang ke peran tindakan secara langsung.

Karena Anda membangun di atas apa yang sudah berfungsi, Anda tidak membatalkan proses Otorisasi yang ada. Anda hanya perlu beberapa tabel lagi untuk menerapkan pendekatan ini

pixelda
sumber
1

Saya kira pertanyaan ini bisa dijawab dari database prospektif. jika Anda memperhatikan bagaimana tabel yang terlibat dalam implantasi ini, Anda akan menemukan yang berikut ini

  1. AspNetUsers: setiap pengguna memiliki satu baris dengan semua atribut yang diperlukan oleh semua pengguna seperti email, telepon alamat, kata sandi .....
  2. AspNetRoles; mendefinisikan peran yang berbeda sesuai persyaratan aplikasi seperti GM, CTO, HRM, ADMIN, EMP. apa peran masing-masing mendefinisikan adalah sesuai kebutuhan aplikasi.
  3. AspNetUserRoles: setiap baris menautkan AspNetUsers dan AspNetRoles dan secara efektif menghubungkan antara satu pengguna dan banyak peran.
  4. AspNetUserClaims: setiap baris memiliki kunci untuk AspNetUsers dan satu jenis dan nilai. sehingga secara efektif menambahkan satu atribut untuk setiap pengguna yang dapat ditambahkan / dihapus pada saat dijalankan.

Penggunaan tabel ini dapat disesuaikan pada satu saat waktu hidup pengguna / aplikasi agar sesuai dengan kebutuhan spesifik.

Pertimbangkan tahap awal "Purchasing Manager" (PM), kita bisa memiliki tiga pendekatan

  1. Aplikasi mengisi AspNetUserRoles dengan satu baris untuk memberikan hak 'PM' untuk membeli. Untuk mengeluarkan pesanan pembelian dengan jumlah berapapun, pengguna hanya perlu peran "PM".

  2. Aplikasi mengisi AspNetUserRoles dengan satu baris untuk memberikan hak 'PM' untuk membeli, dan mengisi AspNetUserClaims klaim tipe TYPE 'Purchasing Amount' dan nilai "<1000" untuk menetapkan batas jumlah. Untuk mengeluarkan pesanan pembelian, pengguna harus memiliki 'PM' dan jumlah pesanan kurang dari nilai klaim dari TYPE 'Jumlah Pembelian'.

  3. Aplikasi mengisi AspNetUserClaims dengan klaim tipe TYPE 'Purchasing Amount' dan nilai "<1000". Setiap pengguna dapat mengeluarkan pesanan pembelian, mengingat jumlahnya kurang dari nilai klaim klaim JENIS 'Jumlah Pembelian' untuk pengguna ini.

Seperti dapat diperhatikan, peran berbasis butir kasar dari hak-hak kaku yang akan menyederhanakan kehidupan pengguna aplikasi dari sudut pandang manajemen sistem. namun itu akan membatasi kemampuan pengguna dari sudut pandang persyaratan bisnis. Di sisi lain, klaim berbasis hak yang sangat baik yang perlu diberikan kepada setiap pengguna. klaim berbasis akan mendorong bisnis juga batas, namun akan membuat manajemen sistem sangat kompleks.

Ahmed Bahtity
sumber
0

Kontrol Akses Berbasis Peran (RBAC)

Di organisasi Anda, Anda mungkin memiliki peran berikut

Karyawan

Pengelola

SDM

Bergantung pada peran atau peran yang dimiliki oleh pengguna yang masuk, Anda mungkin atau mungkin tidak mengotorisasi akses ke sumber daya tertentu dalam aplikasi. Karena kami menggunakan Peran untuk melakukan pemeriksaan otorisasi, ini biasanya disebut Kontrol Akses Berbasis Peran (RBAC) atau Otorisasi Berbasis Peran.

Dalam ASP.NET Core untuk menerapkan otorisasi berbasis peran, kami menggunakan atribut Otorisasi dengan parameter Peran.

[Authorize(Roles = "Admin")]
public class AdministrationController : Controller
{
}

Kontrol Akses Berbasis Klaim (CBAC)

APA ITU Klaim? Klaim adalah pasangan nama-nilai. Ini benar-benar sepotong informasi tentang pengguna, bukan apa yang bisa dan tidak bisa dilakukan oleh pengguna. Misalnya nama pengguna, email, umur, jenis kelamin, dll. Semuanya adalah klaim. Cara Anda menggunakan klaim ini untuk pemeriksaan otorisasi dalam aplikasi Anda bergantung pada bisnis aplikasi dan persyaratan otorisasi Anda.

Misalnya, jika Anda sedang membangun portal karyawan, Anda dapat mengizinkan pengguna yang masuk untuk mengajukan cuti hamil jika nilai klaim gender adalah wanita. Demikian pula, jika Anda membuat aplikasi e-niaga, Anda dapat mengizinkan pengguna yang masuk untuk mengirimkan pesanan jika nilai klaim usia lebih dari atau sama dengan 18.

Klaim berdasarkan kebijakan. Kami membuat kebijakan dan memasukkan satu atau lebih klaim dalam kebijakan itu. Kebijakan tersebut kemudian digunakan bersama dengan parameter kebijakan atribut Otorisasi untuk menerapkan otorisasi berdasarkan klaim.

[Authorize(Policy = "DeleteRolePolicy")]
public async Task<IActionResult> DeleteRole(string id)
{
}
Alexander Zaldostanov
sumber