Saya benar-benar baru dalam penggunaan claims
dalam ASP.NETIdentity
dan ingin mendapatkan ide tentang praktik terbaik dalam penggunaan Roles and/or Claims
.
Setelah semua pembacaan ini, saya masih memiliki pertanyaan seperti ...
T: Apakah kami tidak lagi menggunakan Peran?
T: Jika demikian, mengapa Peran masih ditawarkan?
T: Haruskah kami hanya menggunakan Klaim?
T: Haruskah kita menggunakan Peran & Klaim bersama?
Pikiran awal saya adalah bahwa kita "harus" menggunakannya bersama. Saya melihat Claims
sebagai sub-kategori yang Roles
mereka dukung.
CONTOH:
Peran:
Klaim Akuntansi : CanUpdateLedger, CanOnlyReadLedger, CanDeleteFromLedger
T: Apakah mereka dimaksudkan untuk menjadi eksklusif satu sama lain?
T: Atau apakah lebih baik menggunakan HANYA Klaim dan "sepenuhnya memenuhi syarat" yang Anda klaim?
T: Jadi apa praktik terbaik di sini?
CONTOH: Menggunakan Peran & Klaim Bersama
Tentu saja, Anda harus menulis logika Atribut Anda sendiri untuk ini ...
[Authorize(Roles="Accounting")]
[ClaimAuthorize(Permission="CanUpdateLedger")]
public ActionResult CreateAsset(Asset entity)
{
// Do stuff here
return View();
}
CONTOH: Klaim Anda Berkualifikasi Penuh
[ClaimAuthorize(Permission="Accounting.Ledger.CanUpdate")]
public ActionResult CreateAsset(Asset entity)
{
// Do stuff here
return View();
}
sumber
Jawaban:
Peran adalah kategori simbolis yang mengumpulkan pengguna yang memiliki tingkat hak keamanan yang sama. Otorisasi berbasis peran memerlukan identifikasi pengguna terlebih dahulu, kemudian memastikan peran yang ditetapkan pengguna, dan terakhir membandingkan peran tersebut dengan peran yang diotorisasi untuk mengakses sumber daya.
Sebaliknya, klaim tidak berbasis kelompok, melainkan berbasis identitas.
dari dokumentasi Microsoft :
Pemeriksaan keamanan nantinya dapat menentukan hak untuk mengakses sumber daya berdasarkan nilai satu atau beberapa klaim.
Anda dapat menggunakan keduanya dalam konser, atau menggunakan satu jenis dalam beberapa situasi dan jenis lainnya dalam situasi lain. Ini sebagian besar tergantung pada inter-operasi dengan sistem lain dan strategi manajemen Anda. Misalnya, mungkin lebih mudah bagi manajer untuk mengelola daftar pengguna yang ditetapkan ke peran daripada mengelola siapa yang memiliki Klaim tertentu yang ditetapkan. Klaim bisa sangat berguna dalam skenario RESTful di mana Anda dapat menetapkan klaim ke klien, dan klien kemudian dapat menunjukkan klaim untuk otorisasi daripada meneruskan Nama Pengguna dan Kata Sandi untuk setiap permintaan.
sumber
Seperti yang dijelaskan dengan sempurna oleh @Claies, klaim bisa menjadi lebih deskriptif dan merupakan jenis peran yang dalam. Saya menganggapnya sebagai id peran Anda. Saya memiliki id gym, jadi saya termasuk dalam peran anggota. Saya juga mengikuti pelajaran kickboxing, jadi saya memiliki klaim id kickboxing untuk mereka. Lamaran saya membutuhkan deklarasi peran baru agar sesuai dengan hak keanggotaan saya. Alih-alih, saya memiliki ID untuk setiap kelas grup yang saya ikuti, alih-alih banyak tipe keanggotaan baru. Itulah mengapa klaim lebih cocok untuk saya.
Ada video penjelasan yang bagus tentang Barry Dorrans, berbicara tentang keuntungan menggunakan klaim daripada peran. Dia juga menyatakan bahwa peran, masih dalam .NET untuk kompatibilitas ke belakang. Video ini sangat informatif tentang cara kerja klaim, peran, kebijakan, otorisasi, dan autentikasi.
Anda dapat menemukannya di sini: Otorisasi Inti ASP.NET dengan Barr Dorrans
sumber
Setelah menggunakan berbagai teknik otentikasi dan otorisasi selama beberapa dekade, aplikasi MVC saya saat ini menggunakan metodologi berikut.
Klaim digunakan untuk semua otorisasi. Pengguna diberi satu peran (beberapa peran dimungkinkan tetapi saya tidak membutuhkan ini) - selengkapnya di bawah.
Seperti praktik umum, kelas atribut ClaimsAuthorize digunakan. Karena sebagian besar tindakan pengontrol adalah CRUD, saya memiliki rutinitas dalam pembuatan basis data kode pertama yang mengulang semua tindakan pengontrol dan membuat jenis klaim untuk setiap atribut tindakan pengontrol dari Baca / Edit / Buat / Hapus. Misalnya dari,
[ClaimsAuthorize("SomeController", "Edit")] [HttpPost]
Untuk digunakan di dalam MVC View, kelas pengontrol dasar menyajikan item view bag
protected override void OnActionExecuting(ActionExecutingContext filterContext) { // get user claims var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal; if (user != null) { // Get all user claims on this controller. In this controler base class, [this] still gets the descendant instance type, hence name List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList(); // set Viewbag with default authorisations on this controller ViewBag.ClaimRead = claims.Any(c => c.Value == "Read"); ViewBag.ClaimEdit = claims.Any(c => c.Value == "Edit"); ViewBag.ClaimCreate = claims.Any(c => c.Value == "Create"); ViewBag.ClaimDelete = claims.Any(c => c.Value == "Delete"); } base.OnActionExecuting(filterContext); }
Untuk menu situs web dan tindakan non-pengontrol lainnya, saya memiliki klaim lain. Misalnya apakah pengguna dapat melihat bidang moneter tertentu.
bool UserHasSpecificClaim(string claimType, string claimValue) { // get user claims var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal; if (user != null) { // Get the specific claim if any return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue); } return false; } public bool UserHasTradePricesReadClaim { get { return UserHasSpecificClaim("TradePrices", "Read"); } }
Jadi, di mana peran Peran?
Saya memiliki tabel yang menautkan Peran ke sekumpulan klaim (default). Saat menyetel otorisasi pengguna, defaultnya adalah memberikan klaim kepada pengguna atas peran mereka. Setiap pengguna dapat memiliki lebih banyak atau lebih sedikit klaim daripada default. Untuk mempermudah pengeditan, daftar klaim ditampilkan oleh pengontrol dan tindakan (dalam satu baris), dengan klaim lain kemudian dicantumkan. Tombol digunakan dengan sedikit Javascript untuk memilih serangkaian tindakan guna meminimalkan "klik" yang diperlukan untuk memilih klaim. Di Simpan, klaim pengguna dihapus dan semua klaim yang dipilih ditambahkan. Aplikasi web memuat klaim hanya sekali, jadi setiap perubahan harus mendorong pemuatan ulang dalam data statis ini.
Oleh karena itu, manajer dapat memilih klaim mana yang ada di setiap peran dan klaim mana yang dimiliki pengguna setelah menetapkannya ke peran dan klaim default tersebut. Sistem ini hanya memiliki sejumlah kecil pengguna, jadi mengelola data ini sangatlah mudah
sumber
Untuk memahami perbedaan antara Peran dan Klaim yang Anda kuasai menghadapi batasan peran dan untuk merasakan bagaimana klaim mengatasi masalah ini, maka saya akan memberi Anda 2 skenario untuk mengenali kekuatan klaim di mana peran tidak dapat menyelesaikan masalah ini:
1- situs Anda memiliki dua modul (halaman, layanan .. dll) modul pertama untuk anak (di bawah 18 tahun) yang lain untuk dewasa (di atas 18 tahun) identitas pengguna Anda memiliki klaim ulang tahun
Anda perlu membuat kebijakan untuk klaim ini sehingga otorisasi untuk setiap modul akan diberikan pada nilai ini dan jika usia pengguna lebih dari 18 tahun maka dia dapat masuk ke modul dewasa dan tidak sebelum usia ini
Peran adalah tipe data Boolean Anda dapat memiliki atau tidak peran peran tidak memiliki nilai malty
2- situs Anda memiliki pengguna peran dan Anda tidak ingin mencegah akses pengguna untuk melakukan pemeliharaan tanpa mengubah kode
dalam klaim Anda dapat membuat kebijakan UnderConstrain yang jika pengguna sebenarnya tidak dapat melihat halaman, berikan otorisasi properti untuk pengguna peran.
sumber