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 |