Praktik Terbaik untuk Peran vs. Klaim dalam Identitas ASP.NET

98

Saya benar-benar baru dalam penggunaan claimsdalam ASP.NETIdentitydan 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 Claimssebagai sub-kategori yang Rolesmereka 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();
}
Tahanan ZERO
sumber
1
Jadi, saya menghadapi masalah yang sama sekarang, bagaimana Anda mengatasinya dan bagaimana Anda dapat mensubRole Izin dalam aplikasi?
Loai

Jawaban:

78

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 :

Ketika sebuah identitas dibuat, mungkin ada satu atau lebih klaim yang dikeluarkan oleh pihak terpercaya. Klaim adalah pasangan nilai nama yang mewakili subjeknya, bukan kemampuan subjeknya.

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.

Claies
sumber
7
Saya tidak percaya ini sepenuhnya akurat. Saya yakin Klaim menunjukkan identitas, bukan otorisasi. Apa yang diizinkan untuk mereka lakukan dikelola secara terpisah. Artinya, mereka mungkin memiliki klaim dengan tanggal lahir yang menunjukkan bahwa mereka berusia di atas 18 tahun. Klaim ini akan diteruskan ke Manajer Otorisasi yang dapat berisi aturan yang mengatakan "jika mereka berusia di atas 18 tahun, mereka dapat mengedit sumber daya X", tetapi klaim itu sendiri tidak menunjukkan apa yang bisa / tidak bisa mereka lakukan atau akses. Hal yang sama berlaku untuk peran dan klaim lainnya. Klaim menunjukkan siapa Anda, dan digunakan untuk menentukan apa yang dapat Anda lakukan, tetapi tidak memberi tahu Anda secara langsung
ChrisC
Dokumentasi pendukung untuk @ChrisC berasal dari otorisasi berbasis Klaim Microsoft di ASP.NET Core : "Klaim adalah pasangan nilai nama yang mewakili subjeknya, bukan apa yang dapat dilakukan subjek."
DrGriff
@DrGriff Terima kasih telah menyediakan tautan itu; Saya telah mempertanyakan keakuratan deskripsi yang saya berikan; Saya rasa saya telah mengklarifikasi jawaban berdasarkan tautan itu sekarang.
Claies
31

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

Jonathan Ramos
sumber
8

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

pixelda
sumber
4

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.

mohammed ruam
sumber