ASP.NETコアのポリシーベースのアクセス制御(PBAC)を使用して、JSON Webトークンを使用した許可/属性ベースのアクセス制御(ABAC)を実装するためのヘルパーライブラリ。
アクセス許可列挙を作成します。
public enum Permissions
{
Create = 0 ,
Read = 1 ,
Update = 2 ,
Delete = 3 ,
}各許可の正確な根本的な値を持つことが重要であることに注意してください - それを台無しにすると、保存された許可が台無しになります!
また、 intを基にするタイプ(デフォルト)としてのENUMのみがサポートされています。
PermissionSetを使用して、IDプロバイダー内のユーザー許可値を設定します。
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の基礎となる値を持つ許可の存在を表す16進数として文字列にシリアル化されています。
たとえば、次の許可列挙を検討してください。
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 | 割り当てられます |
|---|---|---|---|---|
| PermissionAuthorizationHandlerbenchmark_handlerequirementasync | 359.4 ns | 6.79 ns | 13.25 ns | 144 b |