使用上下文声明权限值

时间:2018-12-11 06:06:57

标签: c# asp.net asp.net-web-api claims-based-identity claims

我开始在我的asp.net Web API项目中使用基于声明的授权。

在我的项目中,用户可以编辑实体。但是用户有权编辑entity1,但不能编辑entity2。在形式上,他应该能够POST entities/1,但不能POST entities/2

我正在考虑如何在“索赔”中添加此信息。我看到2种方法:

  1. 添加包含实体ID的值的声明:

    this.AddClaim(new Claim("permission", "entity/1/edit"));
    this.AddClaim(new Claim("permission", "entity/42/edit"));
    
  2. 添加类型为edit的Claim,其值是实体的ID:

    this.AddClaim(new Claim("entity/edit", "1"));
    this.AddClaim(new Claim("entity/edit", "42"));
    

我承认我错过了索赔概念。而且,也许有更好的方法可以实现这一目标。

1 个答案:

答案 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());

https://github.com/IdentityModel/Thinktecture.IdentityModel/blob/master/samples/OWIN/ResourceAuthorization/WebApp/ChinookAuthorization.cs

在那里,您将检查当前用户是否有权访问此资源,可能通过DB中的resourceId查找该资源,并检查是否允许当前用户访问。