【发布时间】:2018-08-28 21:23:21
【问题描述】:
我有一个 API 项目,它有很多访问限制,具体取决于用户请求的项目。例如,假设我有这样的 Action:
[HttpPut]
public async Task<IActionResult> EditItem([FromBody]Item editedItem)
{
var item = await db.Items.SingleOrDefaultAsync(i => i.Id == editedItem.Id);
if (item == null) // There is already pre-filter on the DB.
return Unauthorized();
if (item.Status == ItemStatus.Closed)
return Unauthorized();
if (item.Owner != _currentUser)
return Unauthorized();
// Say the normal user only have permissions to edit items on the Status "Added"
if (!(_currentUser is Manager) && editedItem.Status == item.Status.Open)
return Unauthorized();
// Edit the data...
await db.SaveChangesAsync();
return Ok();
}
软件正在增长,并且开始变得嘈杂且不干净。这些动作有 90% 的权限检查和 10% 的实际代码。
在每个控制器中,我都有大量的权限检查。我已经在使用身份验证和授权;事实并非如此。在这里,它取决于用户请求访问的项目。
我想做的是从控制器中删除检查并降低代码的复杂性。
我已经尝试过创建自定义策略、自定义属性和自定义中间件,但是两次检查数据库速度要慢得多,而且对降低复杂性几乎没有作用。
对于我所遗漏的此类问题,是否有任何指导方针?
【问题讨论】:
-
IActionFilter怎么样,例如AuthorizeAttribute的扩展。您甚至可以在全局范围内注册 ActionFilter。
标签: c# asp.net design-patterns asp.net-core architecture