Asp.net core 搜索具有许多权限的基于声明的授权的最佳实践asp net core?
我正在使用asp net core webAPI处理我的应用程序中的安全性,在我的应用程序中,管理员创建一个具有权限的新用户,json发送到后台,如下所示: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,
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
列表
),这意味着您仍然需要键入所有声明名称(初始化列表),那么代码仍然没有缩小多少。策略名称应该事先知道(以便可以使用属性应用),因此看起来您没有更好的选择。除非您有办法在运行时动态应用策略,否则添加策略的代码可能值得缩减。在这种情况下,缩小代码意味着缩小输入。通过缩小输入,我的意思是不使用literalList
,您可以从某处加载它们(例如:db、服务等),这样代码就可以缩小到一行(调用)。这样,您仍然需要相应的策略名称列表。如果它们没有保存在以后可以加载的地方,则必须从声明名称派生(例如:使用命名约定)。否则您别无选择,仍然必须手动硬编码代码中的所有名称。
services.AddSingleton<IAuthorizationPolicyProvider,CustomAuthorizepolicyProvider>();