如何基于WebAPI权限限制HATEOAS导航链接?

问题描述 投票:0回答:1

[我想将HATEOAS类型的链接添加到从WebAPI路由返回的数据中,这将为客户端提供关于任何给定数据可用的操作的线索。

所以,我可能会有类似的东西:

clients: {
  data: [
    {data: {id: 1, name: "Client One", age: 1}, 
     _links: {
       self: {href: ".../api/clients/1}, method: "get"}
       edit: {href: ".../api/clients/1}, method: "put"}
       delete: {href: ".../api/clients/1}, method: "delete"}
     }
    }
  ],
  _links: {
    self: {href: ".../api/clients", method: "get"},
    add: {href: ".../api/clients", method: "post"}
  }
}

[我看过很多关于如何包括链接的文章,所以那部分都不是问题。

问题

HATEOAS背后的部分想法是使数据自定义/自导航。因此,我希望看到的是_links仅包括基于用户权限允许用户使用的内容。 IOW,如果允许用户Edit客户端而不是Delete客户端,则_links应该包括编辑但不包括删除。

然后问题是,在生成链接时,我实际上需要评估操作/路由的Authorization Policy,以确定是否应包括链接。

所以给出了这样的内容(这只是一个谈话要点,而不是实际的代码):

[Route("api/v1/[controller]")]
[APIController]
[Authorize(Policy="HR")]
public class UsersController : ControllerBase {

   [HttpGet]
   public async Task<IActionResult> GetClients() { 
       var results = new List<dynamic>();
       var list = context.Clients.Select(u => new BasicClient(u.Id, u.Name))
          .ToList();

       foreach(var client in list){
         //If user has access to GetClient Action
         if(??) { 
           client._links.Self.Href = Url.Action("GetClient", new {id = client.Id});
         }

         //If user has access to DeleteClient Action
         if(??) {
           client._links.Delete.Href = Url.Action("DeleteClient", new {id = client.Id});
        }
        ...
   }

   [HttpGet("{id}", Name="GetClient")]
   [Authorize(Policy="ViewClient")]
   public async Task<IActionResult> GetClient(int id){ ... }

   [HttpDelete("{id}", Name="DeleteClient")]
   [Authorize(Policy="DeleteClient")]
   public async Task<IActionResult> DeleteClient(int id) { ... }

用户将需要同时满足HRViewClients策略所必需的权限才能获得self链接,另外还需要DeleteClients策略来获得delete链接。

这可能吗?我在考虑这个错误吗?有更好的方法吗?

澄清

虽然可以使用AuthorizationService来检查特定策略,但是我想做的是避免使用硬编码策略。我已经尝试在ControllerActions上定义了策略。我想知道是否有一种方法可以针对Action验证用户(并让框架整理出需要应用哪些政策)。

因此,与Url.Action("GetClient",...)Action的名称并根据定义的路由建立正确的链接的方式相同,我想要类似AuthService.AuthorizeAction("GetClient", User)的名称,它将确定需要哪些权限以及用户是否需要拥有那些权限。

希望.NetCore具有内置的功能。如果没有,我想我可以使用反射和IAuthorizationService来做到这一点。

c# rest asp.net-core-webapi hateoas
1个回答
0
投票

IAuthorizationService是您要寻找的服务。这是一个代码片段:

IAuthorizationService
© www.soinside.com 2019 - 2024. All rights reserved.