Pbac.AspNetCore
1.0.1
使用ASP.NET CORE的基於策略的訪問控制(PBAC),使用JSON Web令牌實現基於權限/屬性的訪問控制(ABAC)的幫助人庫。
創建權限枚舉:
public enum Permissions
{
Create = 0 ,
Read = 1 ,
Update = 2 ,
Delete = 3 ,
}請注意,擁有每個權限的確切基礎值很重要 - 將其弄亂會弄亂存儲的權限!
同樣,目前僅支持具有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>枚舉類型:
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 ( ) ;或使用最小API:
app . MapGet ( "/" , ( ) => Results . Ok ( ) )
. RequirePermission ( Permissions . Read ) ; 權限集將其序列化為字符串,作為十六進制號,其中n -th位代表存在n的基礎值的許可。
例如,考慮以下權限枚舉:
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
對於避難所化,以上是按反向順序完成的。
另外,由於基於枚舉值,我們可以計算需要檢查的特定位置位置,因此當我們驗證單個權限時,我們不需要對整個字符串進行驗證。
從緊湊型字符串中檢查單個權限值:
| 方法 | 意思是 | 錯誤 | stddev | 分配 |
|---|---|---|---|---|
| Permissionset_haspermission | 74.17 ns | 1.382 ns | 1.225 ns | - |
驗證用戶在其索賠列表中具有所需的許可:
| 方法 | 意思是 | 錯誤 | stddev | 分配 |
|---|---|---|---|---|
| 授權handlerbench_handlerequirementasync | 359.4 ns | 6.79 ns | 13.25 ns | 144 b |