【发布时间】:2016-01-24 02:33:39
【问题描述】:
我正在尝试在 OData WebAPI 服务中构建安全架构。这个想法是做解耦架构,安全层应该与WebAPI控制器松耦合,这意味着当我更新WebAPI控制器时,我不需要更新安全层,我只需要以某种方式为安全层提供规则。 我希望我可以只在一层安全层中进行安全检查,而不包括业务层以进行更复杂的检查。我正在阅读建议的解决方案,其中大多数基本相似,我应该使用令牌提供者的令牌进行身份验证,使用角色提供者的角色进行授权。授权是通过使用 Authorize 属性标记 WebAPI 控制器方法来完成的。例如,我有 CompaniesController:
public class CompaniesController : ODataController
{
//code omitted
[Authorize("Admin,CompanyAdmin")]
public IQueryable<User> GetUsers()
{
//code for querying users from database...
}
}
此代码将仅允许具有角色 Admin 和/或 CompanyAdmin 的客户调用方法 Companies(id)/GetUsers,其中 id 是 Company 的唯一键。暴露的资源是属于具有该 ID 的公司的用户的集合。 我同意这种方法是很好的架构,但这并不能解决下一个问题: 我希望有一个安全规则,允许 CompanyAdmin 仅从由该 CompanyAdmin 管理的公司获取用户。这让我很难决定如何实现这一点,这应该是安全层还是业务层的“工作”。
- 如果是安全层工作,思路如下:
将 CompanyAdmin 标识添加为令牌中的声明,并根据请求 URL(例如 /Companies(2)/GetUsers)中的 id 检查该值,如果它与返回的用户匹配,否则返回状态代码 401 Unauthorized。在派生自 Authorize 属性的属性类中执行检查 - 例如。 [AdvancedAuthorize("Admin,CompanyAdmin{identification}")] 括号中的标识表示对于 CompanyAdmin 安全层需要比较来自令牌的标识值和来自 URL 的 id 值
- 如果是业务层工作,思路是这样的:
从令牌中获取 CompanyAdmin 标识,与 1 相同。从数据库中接近或获取标识,从 Authorizations 表中我们有每个用户的授权记录,并检查来自 URL 的 id 是否匹配。业务层方法是从 WebAPI 控制器调用的,我会从 URL 中提供 id 作为业务层方法中的参数。
哪种方法更好?或者也许其他一些方法比两者都好?
【问题讨论】:
标签: c# security authorization token asp.net-web-api