【问题标题】:What is the appropriate way to authorize a subset of a collection provided by a controller?授权控制器提供的集合子集的适当方法是什么?
【发布时间】:2019-09-19 21:15:07
【问题描述】:
我有一个控制器foo,它通过响应bar 对象的集合来处理对foo/bars 的GET 请求。我希望我的自定义AuthorizationHandler 和控制器一起工作,以确保当有权查看 ID 为 1、2 和 3 但不是 4、5 和 6 的条的用户时,控制器返回正确的 @ 子集987654325@ 个对象。
这是一个 dotnet core 2.2 webApi。该请求将在Authorization 标头中具有一个访问令牌作为承载令牌。访问令牌将有适当的声明来做出决定。在从数据源检索bars 列表时,使用授权过程创建控制器必须应用的过滤器的最佳方法是什么?
【问题讨论】:
标签:
c#
asp.net-core-webapi
【解决方案1】:
这不应该通过授权来完成,因为您正在过滤一组实体。授权用于决定用户是否可以访问任何东西。您需要做的是向实体添加一个属性以跟踪谁“拥有”它,如果这是一个要求,可能会有很多“所有者”。然后,当您进行查询时,您只需将当前用户添加到查询中,以仅选择该用户是所有者或所有者之一的那些项目。例如,假设您在实体上坚持OwnerId 之类的内容,那么您会这样做:
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
var foos = await _context.Foos.Where(x => x.OwnerId == userId).ToListAsync();
【解决方案2】:
您可以在 POCO 中添加一个字段,例如可以获取或设置的 bool IsAdmin。
在设定的时间,您可以将其设置为有权访问的人。
然后你可以检查:
var foos = await _context.Foos.Where(x => x.IsAdmin).ToListAsync();