繁体   English   中英

分层应用程序中的授权

[英]Authorization in a layered application

我正在做一个非常简单的项目,该项目主要由吸气剂组成,搜索和对某些数据的访问受到用户的限制。 在这种情况下,我想借此机会在安全性和授权方面做一些最佳实践。

一次激活该应用程序,这时将生成令牌并将其用于将来的请求。

我的应用程序具有用于端点的Web api,该api位于一组服务的顶部,而该服务位于一组repo的顶部,而这些repo则位于sql server db的顶部。 控制器要做的就是将请求向下转发到服务层。

这是一个示例控制器:

[ApiAuthorize]
[RoutePrefix("api/Catalogue")]
public class CatalogueController : ApiController
{
    private ICatalogueService _catalogueService;
    public CatalogueController(ICatalogueService catalogueService)
    {
        _catalogueService = catalogueService;
    }

    [HttpGet]
    [Route("GetCatalogues")]
    public IHttpActionResult GetCatalogues(string branchEan)
    {
        var catalogues = _catalogueService.GetCatalogues(new GetCataloguesRequest()
        {
            BranchEan = branchEan
        });

        return Ok(catalogues);
    }
}

我的自定义授权属性会检查令牌,如果有效,则会从令牌中拉出用户详细信息,并创建通用原则,然后该通用原则可在我的控制器中使用。

对我来说,Web api只是公开我的业务\\服务层的一种方法,应该在服务层的较低层进行授权,但是我无法想到一种将信息收集到该层的干净方法。 在上面的示例中,服务层将需要检查用户(从令牌中)是否有权访问该特定分支,这意味着服务层将需要知道谁在发出请求。 我能想到的两个解决方案是:

1)我在服务层上使用了请求\\响应模式,因此我可以创建一个名为“请求”的抽象基类作为示例,该类可以存储所有用户详细信息,并且服务层的每个请求对象都可以从此继承,因此提供用户详细信息到我的服务层。

public abstract class Request
{
    public Request(string username)
    {
        this.Username = username;
    }

    public string Username { get; private set; }
}

public class GetCataloguesRequest : Request
{
    public GetCataloguesRequest(string username) : base(username)
    {
    }
}

2)要定义一个接口,例如ISecurity,然后将其注入到我的服务层中,但这将需要服务层之上的各层来实现该接口。

我在这里读到了- 将授权放置在服务层而不是Web API层中 ,以创建一个授权层,但是我不确定这在技术上是否实现。

有任何想法吗?

您正在寻找的是细粒度的外部授权:

  • 细粒度:您要创建授权策略,其中要考虑多个参数或属性以及客户端(请求者)和目标实体之间的关系,例如您的案例中的列表。
  • 外部化:您希望将业务逻辑与授权逻辑分离。 在您的问题中,您抱怨代码和SQL语句变得越来越复杂。 这是未将业务逻辑与授权逻辑明确分开的直接结果。

有一个称为基于属性的访问控制(ABAC)的模型,该模型定义了一种用于细化外部授权的方法。 美国国家标准与技术研究院NIST已发布了一份关于ABAC报告 ,您可以在线阅读该报告

OASIS是促进结构化信息标准的组织,已经定义了一个称为XACML (可扩展访问控制标记语言)的标准来实现ABAC。

XACML为您带来:

  • 如下所示的架构
    • 策略执行点(PEP)拦截您的API调用。 它可以保护您的API,检查消息并将授权请求发送到策略决策点(PDP)。
    • 策略决策点(PDP)根据XACML编写的一组授权策略评估来自PEP的传入授权请求。 PDP最终会做出“允许”或“拒绝”决定。 为了做出决定,可能需要从数据库,Web服务,LDAP或文件中查找其他属性值。 这些在体系结构中称为策略信息点。 XACML架构流程
  • 一种策略语言:XACML策略语言是基于属性的,这意味着它使用属性来定义允许的内容和不允许的内容。 例如,您可以定义规则,例如:
    • 当且仅当房源位置==代理商位置时,房地产经纪人才能查看所有列表
    • 房地产经纪人只有在拥有该房源的情况下,才能编辑该房源
    • 当且仅当售出该物品的物品并且仅当该代理商是出售物品的人时,房地产经纪人才能关闭该物品。
  • 请求/响应方案:XACML还定义了一种查询PDP并获取响应的方法。 可以通过单个问题或单个请求中的多个问题来查询PDP,例如:
    • 爱丽丝可以查看列表123吗? 是的,请允许。
    • 爱丽丝可以查看,编辑或删除列表123吗? 允许; 拒绝; 拒绝。

使用基于XACML的方法,您可以将业务逻辑和API与授权逻辑分开维护。 这有几个好处:

  1. 您可以随时重新实现API并保留相同的授权模型
  2. 您可以轻松扩展您的API,而无需重写授权
  3. 您可以独立于代码来更改授权逻辑
  4. 您可以更轻松地审核授权逻辑
  5. 您的授权逻辑与技术无关。 它适用于REST API,Web服务,数据库等

我建议您检查以下资源:

  1. OASIS XACML网站
  2. EclipseALFA插件 -编写XACML策略的免费工具。
  3. XACML开发人员社区

XACML既有供应商也有开源实现:

  • 公理学是一种提供.NET和Java XACML实现的供应商解决方案
  • SunXACML是一个长期的开源Java XACML实现。

戴维

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM