Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 搜索具有许多权限的基于声明的授权的最佳实践asp net core?_Asp.net Core_Authorization_Webapi_Claims - Fatal编程技术网

Asp.net core 搜索具有许多权限的基于声明的授权的最佳实践asp net core?

Asp.net core 搜索具有许多权限的基于声明的授权的最佳实践asp net core?,asp.net-core,authorization,webapi,claims,Asp.net Core,Authorization,Webapi,Claims,我正在使用asp net core webAPI处理我的应用程序中的安全性,在我的应用程序中,管理员创建一个具有权限的新用户,json发送到后台,如下所示: User: { Name:"Alex", SurName:"Park", Email: "Alex@gmail.com", Permission: { EditEmployee: true, DeleteEmployee: true,

我正在使用asp net core webAPI处理我的应用程序中的安全性,在我的应用程序中,管理员创建一个具有权限的新用户,json发送到后台,如下所示:

User: {
     Name:"Alex",
     SurName:"Park",
     Email: "Alex@gmail.com",
Permission: {
    EditEmployee: true,
    DeleteEmployee: true,
    CreateEmployee: false,
    EditClient: true,
    DeleteClient: true,
    CreateClient: false,
    .....
    ...... // more than 15 other permission
}
}
在我的数据库中,我有一个表user:have RoleId外键 表角色具有所有用户角色 和表UserClaims,其中保存了具有所有权限值的UserId,type 我的问题是:如果我在startup的服务中添加策略,我必须定义所有策略;还有15个,我想是很多

services.AddAuthorization(options =>
  services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeEdit", policy => policy.RequireClaim("EditEmployee"));
    ...
    ... // SAME WORK WITH THE OTHER CLAIMS
    });
我想问一下,是否有将代码最小化的良好实践,
谢谢

您可以通过
AuthorizationPolicyProvider
动态创建授权策略。但也需要提供索赔

自定义一个
AuthorizationPolicyProvider
,它可以获取policyname,我们可以根据policyname创建策略

   public class CustomAuthorizepolicyProvider : DefaultAuthorizationPolicyProvider
   {
    public CustomAuthorizepolicyProvider(IOptions<AuthorizationOptions> options):base(options)
    {

    }
    public override Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
    {
        //generate the authorization policy
        var claims= new List<string> 
        {
          // give 15 claims, or get the claims from database
        };

        foreach(var claim in claims)
        {
            if (claim == policyName)
            {
                return Task.FromResult(new AuthorizationPolicyBuilder().RequireClaim(claim).Build());
            }
        }
        
        return base.GetPolicyAsync(policyName);
    }
   }

您的输入是索赔的集合。因此,如果该输入来自内存(例如:一个literal
列表
),这意味着您仍然需要键入所有声明名称(初始化列表),那么代码仍然没有缩小多少。策略名称应该事先知道(以便可以使用属性应用),因此看起来您没有更好的选择。除非您有办法在运行时动态应用策略,否则添加策略的代码可能值得缩减。在这种情况下,缩小代码意味着缩小输入。通过缩小输入,我的意思是不使用literal
List
,您可以从某处加载它们(例如:db、服务等),这样代码就可以缩小到一行(调用)。这样,您仍然需要相应的策略名称列表。如果它们没有保存在以后可以加载的地方,则必须从声明名称派生(例如:使用命名约定)。否则您别无选择,仍然必须手动硬编码代码中的所有名称。
services.AddSingleton<IAuthorizationPolicyProvider,CustomAuthorizepolicyProvider>();