我开始在我的asp.net Web API项目中使用基于声明的授权。
在我的项目中,用户可以编辑实体。但是用户有权编辑entity1
,但不能编辑entity2
。在形式上,他应该能够POST entities/1
,但不能POST entities/2
。
我正在考虑如何在“索赔”中添加此信息。我看到2种方法:
添加包含实体ID的值的声明:
this.AddClaim(new Claim("permission", "entity/1/edit"));
this.AddClaim(new Claim("permission", "entity/42/edit"));
添加类型为edit
的Claim,其值是实体的ID:
this.AddClaim(new Claim("entity/edit", "1"));
this.AddClaim(new Claim("entity/edit", "42"));
我承认我错过了索赔概念。而且,也许有更好的方法可以实现这一目标。
答案 0 :(得分:1)
更好的方法是基于资源的授权。https://docs.microsoft.com/en-us/aspnet/core/security/authorization/resourcebased?view=aspnetcore-2.2
如果您不在asp.net核心中,则可以尝试https://leastprivilege.com/2014/06/24/resourceaction-based-authorization-for-owin-and-mvc-and-web-api/
基本思想是您检查对资源(文档)的访问。授予/拒绝访问权限时,此信息的存储方式无关紧要。
if (!HttpContext.CheckAccess(
"Edit",
"Album",
id.ToString()))
{
return new HttpUnauthorizedResult();
}
然后您将有一个单独的模块,其中定义了授权规则
app.UseResourceAuthorization(new ChinookAuthorization());
在那里,您将检查当前用户是否有权访问此资源,可能通过DB中的resourceId查找该资源,并检查是否允许当前用户访问。