Perpustakaan penolong untuk mengimplementasikan Kontrol Akses Berbasis Izin/Atribut (ABAC) dengan JSON Web Token menggunakan Asp.Net Core's Based Access Control (PBAC).
Buat izin enum:
public enum Permissions
{
Create = 0 ,
Read = 1 ,
Update = 2 ,
Delete = 3 ,
}Perhatikan bahwa memiliki nilai mendasar yang tepat untuk setiap izin adalah penting - mengacaukannya akan mengacaukan izin yang disimpan!
Juga, hanya enum dengan int sebagai tipe yang mendasarinya (default) yang saat ini didukung.
Atur nilai izin pengguna di dalam penyedia identitas Anda menggunakan PermissionSet :
user . Claims [ ClaimNames . Permissions ] = new PermissionSet < Permissions > ( new [ ]
{
Permissions . Create ,
Permissions . Read ,
} )
. ToCompactString ( ) ;Tambahkan penangan persyaratan kebijakan izin dengan nama klaim yang sama seperti di atas:
services . AddPermissionBasedAuthorization < Permissions > ( options =>
options . PermissionsClaimName = ClaimNames . Permissions ) ; Perhatikan bahwa jika Anda mendefinisikan ulang otorisasi DefaultPolicy di aplikasi Anda maka kode di atas harus dimasukkan setelah logika Anda untuk membuat kebijakan izin mewarisi kebijakan default baru.
(Secara opsional) mewarisi AuthorizePermission<T> dengan izin spesifik Enum Tipe:
public class AuthorizePermissionAttribute : AuthorizePermissionAttribute < Permissions >
{
public AuthorizePermissionAttribute ( Permissions permission )
: base ( permission )
{ }
}Atau buat metode ekstensi jika menggunakan API minimal:
public static TBuilder RequirePermission < TBuilder > ( this TBuilder builder , Permissions permission )
where TBuilder : IEndpointConventionBuilder
{
if ( builder == null )
throw new ArgumentNullException ( nameof ( builder ) ) ;
return builder . RequireAuthorization ( new AuthorizePermissionAttribute < Permissions > ( permission ) ) ;
} Hiasi pengontrol/titik akhir dengan Atribut AuthorizePermission<T> (atau yang dibuat di atas):
[ HttpGet ]
[ Authorize ( Permissions . Read ) ]
public IActionResult Get ( )
=> Ok ( ) ;Atau jika menggunakan API minimal:
app . MapGet ( "/" , ( ) => Results . Ok ( ) )
. RequirePermission ( Permissions . Read ) ; Set izin sedang diserialisasi menjadi string sebagai nomor hex di mana bit n -th mewakili adanya izin dengan nilai yang mendasari n .
Misalnya, pertimbangkan izin berikut ini:
public enum Permissions
{
Create = 0,
Read = 1,
Update = 2,
Delete = 3,
Manage = 4,
}
Kemudian, representasi biner dari satu set yang berisi semua izin di atas akan terlihat seperti ini:
1 F - permission string
┌┬┬┤ ┌┬┬┤
0001 1111 - permission bit values
││││ ││││
7654 3210 - bit positions
└┬┘│ ││││
│ │ │││└ Create
│ │ ││└ Read
│ │ │└ Update
│ │ └ Delete
│ └ Manage
└ Not used
Untuk deserialisasi, hal di atas dilakukan dalam urutan terbalik.
Juga, karena berdasarkan nilai enum kita dapat menghitung posisi bit spesifik yang perlu kita periksa, kita tidak perlu deserialize seluruh string ketika kita memverifikasi satu izin.
Memeriksa nilai izin tunggal dari string kompak:
| Metode | Berarti | Kesalahan | Stddev | Dialokasikan |
|---|---|---|---|---|
| Permisionset_haspermission | 74.17 ns | 1.382 ns | 1.225 ns | - |
Memvalidasi pengguna memiliki izin yang diperlukan dalam daftar klaim mereka:
| Metode | Berarti | Kesalahan | Stddev | Dialokasikan |
|---|---|---|---|---|
| IzinAuthorizationHanderbenchmark_handlerequirementAsync | 359.4 ns | 6.79 ns | 13.25 ns | 144 b |