我正试图在OData WebAPI服务中构建安全体系结构。其思想是建立解耦的体系结构,安全层应该与WebAPI控制器松散耦合,这意味着当我更新WebAPI控制器时,我不需要更新安全层,我只需要以某种方式向安全层提供规则。--如果我只需要在一个层(安全层)进行安全检查,而不包括业务层(用于更复杂的检查,)。我读到了所提出的解决方案,其中大多数基本上是相似的,我应该使用令牌提供程序的令牌进行身份验证,角色提供程序使用角色进行授权。授权是通过标记带有授权属性的WebAPI控制器方法来完成的。例如,我有CompaniesController:
public class CompaniesController : ODataController
{
//code omitted
[Authorize("Admin,CompanyAdmin")]
public IQueryable<User> GetUsers()
{
//code for querying users from database...
}
}此代码只允许具有角色管理和/或CompanyAdmin的客户端调用方法公司( id )/GetUsers,其中id是公司的唯一密钥。公开的资源是具有该id的公司用户的集合。我同意这种方法是一个很好的架构,但这并不能解决下一个问题:我希望有一个安全规则,允许CompanyAdmin只从公司获得由该CompanyAdmin管理的用户。这让我很难决定如何做到这一点,这应该是安全层或业务层的“工作”。
在令牌中添加CompanyAdmin标识作为声明,并在request (ex )中对照id检查该值。/Companies(2)/GetUsers),如果它匹配返回用户,否则返回状态代码401未经授权。在从授权属性- ex派生的属性类中执行检查。AdvancedAuthorize(“管理,CompanyAdmin {标识}”)括号中的标识意味着对于CompanyAdmin安全层,需要比较从令牌到id值的标识值。
从令牌获取CompanyAdmin标识,与1.方法相同,或从数据库获取标识,从Authorizations表获得每个用户的授权记录,并检查从URL匹配获得的id是否匹配。业务层方法是从WebAPI控制器调用的,我将在业务层方法中提供id作为参数。
哪种方法更好?或者其他方法比两者都好?
发布于 2015-10-25 15:52:42
在这种情况下,公开的资源将是用户的集合。
GET /companies/{company-id}/users就我个人而言,我会同意你的第二个选择,因为这似乎更容易实现。
否则,需要在自定义授权筛选器中使用一些业务逻辑,以确定请求“用户”子资源的公司是由经过身份验证的用户管理的。
https://stackoverflow.com/questions/33321257
复制相似问题