我正在研究一个非常简单的项目,该项目主要由 getter 和搜索组成,并且对某些数据的访问受到限制,具体取决于用户。在这种情况下,我想利用这个机会在安全性和授权方面做一些最佳实践。
应用程序被激活一次,此时生成令牌并用于将来的请求。
我的应用程序有一个用于端点的 web api,它位于一组服务的顶部,这些服务位于一组位于 sql server db 顶部的 repo 之上。控制器所做的只是将请求转发到服务层。
这是一个示例控制器:
[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 层 - 以创建授权层,但我不确定它的技术实现。
有任何想法吗?