Izin / model / pola yang tepat untuk aplikasi .NET

9

Saya perlu menerapkan fleksibel DAN sederhana (jika ada) dan pada saat yang sama menggunakan sarana bawaan jika memungkinkan

Sejauh ini saya telah menerapkan MembershipProvider dan RoleProviders. Ini keren tapi kemana saya harus pergi selanjutnya?

Saya merasa seperti saya perlu menambahkan istilah "Priviledge" dan daripada hardcode yang ada di dalam aplikasi. Pengguna akan mengonfigurasi peran untuk menambahkan Privilidges ke Peran dan menetapkan Peran kepada pengguna.

Apakah itu terdengar seperti model yang bagus? Haruskah saya berpikir tentang menambahkan hak istimewa di tingkat Pengguna selain menambahkannya ke Peran? Saya mungkin tetapi saya membayangkan masalah dengan pengaturan (membingungkan) dan dukungan berikut.

Jika saya tidak melakukan itu dan beberapa pengguna tertentu akan membutuhkan hak istimewa yang lebih rendah - admin harus membuat peran lain, dll.

Adakah peluru perak untuk sistem seperti ini? Dan mengapa Microsoft tidak melangkah lebih jauh dari sekadar penyedia Keanggotaan dan Peran?

Gagasan lain: Tinggalkan Peran sebagai pemegang "hak pribadi" dan hardcode mereka. Lalu saya bisa kode untuk peran-peran di dalam aplikasi menggunakan semua markup / atribut yang tersedia, dll - semua Microsoft.

Tambahkan entitas baru "Grup" dan buat hubungan seperti ini

  • Pengguna
  • Grup Pengguna
  • Grup
  • RoleGroups
  • Peran

Dengan cara ini saya dapat mengumpulkan Peran ke dalam grup dan menugaskan grup tersebut ke Pengguna. Kedengarannya hebat dan cocok dengan pola perangkat lunak lainnya. Tapi kemudian saya tidak bisa benar-benar mengimplementasikan hal-hal di dalam RoleProvider seperti:

  • AddUsersToRoles
  • RemoveUsersFromRoles

Dan beberapa hal tidak benar-benar masuk akal lagi karena mereka akan dikodekan dengan keras

  • DeleteRole
  • Buat Peran
katit
sumber

Jawaban:

5

Jika otorisasi berbasis peran tidak cukup granular untuk Anda, maka pertimbangkan untuk menggunakan Otorisasi Berbasis Klaim .

Klaim menggambarkan sumber daya dan aktivitas - semacam entri di ACL, tetapi lebih fleksibel, karena "sumber daya" tidak harus berupa objek fisik, bisa berupa apa pun yang Anda inginkan dan dapat berisi informasi apa pun kamu ingin.

Dalam model ini, klaim setara dengan apa yang Anda sebut "hak istimewa", dan Anda mengelompokkan klaim ke dalam set klaim, yang kira-kira setara dengan apa yang Anda sebut "peran". Semua API ini dan lainnya sudah ada di System.IdentityModelnamespace.

Tentu saja Anda menyebutkan MembershipProviderdan RoleProviderdan jika Anda mencoba menjejalkan semua ini ke dalam model keanggotaan ASP.NET (seperti yang tersirat dari nama-nama itu), maka lupakan saja. Jika Anda ingin menggunakan API penyedia tersebut, maka Anda harus melakukannya dengan caranya sendiri, dan caranya tidak lebih terperinci daripada konsep peran.

Sebaliknya, di ASP.NET, konsep "hak istimewa" sebenarnya disandikan di tingkat tindakan atau operasi , di mana Anda menyatakan peran mana yang diizinkan untuk melakukan tindakan itu. Ini benar-benar jauh lebih mudah untuk ditangani dalam ASP.NET MVC di mana Anda baru saja menampar [AuthorizeAttribute]pada tindakan pengontrol atau pengontrol; di ASP.NET "old-school", Anda menangani acara, jadi otorisasi cenderung bersifat ad-hoc atau di tingkat halaman (atau keduanya).

Aaronaught
sumber
Banyak informasi bagus, terima kasih! Aplikasi sebenarnya adalah aplikasi Silverlight dengan porsi server yang ditampilkan sebagai layanan WCF RESTful. Berbasis Klaim terlihat menarik tetapi saya tidak memperhatikan konsep pengguna dan autorisasi di dalamnya. Artikel menarik yang baru saya temukan: geekswithblogs.net/shahed/archive/2010/02/05/137795.aspx
katit
@katit: Hampir semua otentikasi / otorisasi dalam .NET didasarkan pada antarmuka IPrincipal . Jika Anda melakukan otorisasi berbasis klaim maka Anda menggunakan IClaimsPrincipal untuk itu, dan melemparkan IPrincipalke IClaimsPrincipalketika Anda ingin melakukan pemeriksaan klaim. Anda akan menulis banyak kode Anda sendiri jika Anda ingin menyesuaikannya dengan (misalnya) Formulir Otentikasi, tetapi jelas itu dapat dilakukan (sesuai tautan).
Aaronaught
pertanyaannya adalah .. Mungkin lebih mudah untuk hanya menambah level "Grup" ke penyedia keanggotaan / peran atau menulis penyedia sendiri? Jumlah pekerjaan yang hampir sama dengan mengimplementasikan Microsoft
katit
3
@katit: Kata-kata terakhir yang terkenal. Jangan menciptakan milik Anda sendiri kecuali Anda memiliki alasan yang sangat baik untuk menciptakan milik Anda sendiri ("sepertinya lebih mudah" bukan alasan yang baik; itu hanya tampak lebih mudah ketika Anda tidak memiliki pengalaman langsung dan dengan demikian tidak memiliki kemampuan untuk menilai jumlah pekerjaan yang dibutuhkan).
Aaronaught