ไลบรารีผู้ช่วยสำหรับการใช้งานการควบคุมการเข้าถึง/แอตทริบิวต์ (ABAC) ด้วยโทเค็นเว็บ JSON โดยใช้การควบคุมการเข้าถึงตามนโยบายของ ASP.NET Core (PBAC)
สร้าง enum สิทธิ์:
public enum Permissions
{
Create = 0 ,
Read = 1 ,
Update = 2 ,
Delete = 3 ,
}โปรดทราบว่าการมีค่าพื้นฐานที่แน่นอนสำหรับการอนุญาตแต่ละครั้งเป็นสิ่งสำคัญ - การทำให้ยุ่งเหยิงจะทำให้การอนุญาตที่เก็บไว้!
นอกจากนี้ยังมีการรองรับ enums ที่มี int เป็นประเภทพื้นฐาน (ค่าเริ่มต้น) เท่านั้น
ตั้งค่าการอนุญาตผู้ใช้ภายในผู้ให้บริการข้อมูลประจำตัวของคุณโดยใช้ PermissionSet :
user . Claims [ ClaimNames . Permissions ] = new PermissionSet < Permissions > ( new [ ]
{
Permissions . Create ,
Permissions . Read ,
} )
. ToCompactString ( ) ;เพิ่มตัวจัดการข้อกำหนดนโยบายการอนุญาตด้วยชื่อการเรียกร้องเดียวกันกับด้านบน:
services . AddPermissionBasedAuthorization < Permissions > ( options =>
options . PermissionsClaimName = ClaimNames . Permissions ) ; โปรดทราบว่าหากคุณกำหนด DefaultPolicy การอนุมัติในแอปของคุณอีกครั้งรหัสด้านบนควรได้รับการแทรกหลังจากตรรกะของคุณเพื่อให้นโยบายการอนุญาตรับมรดกนโยบายเริ่มต้นใหม่
(ทางเลือก) สืบทอด AuthorizePermission<T> ด้วยการอนุญาตเฉพาะประเภท enum:
public class AuthorizePermissionAttribute : AuthorizePermissionAttribute < Permissions >
{
public AuthorizePermissionAttribute ( Permissions permission )
: base ( permission )
{ }
}หรือสร้างวิธีการขยายหากใช้ API ขั้นต่ำ:
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 ) ) ;
} ตกแต่งคอนโทรลเลอร์/จุดปลายด้วยแอตทริบิวต์ AuthorizePermission<T> (หรืออันที่สร้างขึ้นด้านบน):
[ HttpGet ]
[ Authorize ( Permissions . Read ) ]
public IActionResult Get ( )
=> Ok ( ) ;หรือถ้าใช้ APIs ขั้นต่ำ:
app . MapGet ( "/" , ( ) => Results . Ok ( ) )
. RequirePermission ( Permissions . Read ) ; ชุดการอนุญาตจะถูกทำให้เป็นอนุกรมเป็นหมายเลข hex ที่บิต n -th แสดงถึงการมีอยู่ของการอนุญาตที่มีค่าพื้นฐานของ n
ตัวอย่างเช่นพิจารณา enum ที่ได้รับอนุญาตต่อไปนี้:
public enum Permissions
{
Create = 0,
Read = 1,
Update = 2,
Delete = 3,
Manage = 4,
}
จากนั้นการเป็นตัวแทนไบนารีของชุดที่มีสิทธิ์ทั้งหมดข้างต้นจะมีลักษณะเช่นนี้:
1 F - permission string
┌┬┬┤ ┌┬┬┤
0001 1111 - permission bit values
││││ ││││
7654 3210 - bit positions
└┬┘│ ││││
│ │ │││└ Create
│ │ ││└ Read
│ │ │└ Update
│ │ └ Delete
│ └ Manage
└ Not used
สำหรับ deserialization, ข้างต้นทำตามลำดับย้อนกลับ
นอกจากนี้เนื่องจากจากค่า enum เราสามารถคำนวณตำแหน่งบิตเฉพาะที่เราต้องตรวจสอบเราไม่จำเป็นต้อง deserialize สตริงทั้งหมดเมื่อเราตรวจสอบการอนุญาตเดียว
การตรวจสอบค่าสิทธิ์เดียวจากสตริงขนาดกะทัดรัด:
| วิธี | หมายถึง | ข้อผิดพลาด | stddev | จัดสรร |
|---|---|---|---|---|
| Permissionset_haspermission | 74.17 NS | 1.382 ns | 1.225 ns | - |
การตรวจสอบความถูกต้องของผู้ใช้มีสิทธิ์ที่จำเป็นในรายการเรียกร้องของพวกเขา:
| วิธี | หมายถึง | ข้อผิดพลาด | stddev | จัดสรร |
|---|---|---|---|---|
| PermissionAuthorizationHandlerBenchmark_handlerequirementasync | 359.4 ns | 6.79 ns | 13.25 ns | 144 b |