首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OData WebAPI的安全体系结构

OData WebAPI的安全体系结构
EN

Stack Overflow用户
提问于 2015-10-24 17:37:22
回答 1查看 459关注 0票数 0

我正试图在OData WebAPI服务中构建安全体系结构。其思想是建立解耦的体系结构,安全层应该与WebAPI控制器松散耦合,这意味着当我更新WebAPI控制器时,我不需要更新安全层,我只需要以某种方式向安全层提供规则。--如果我只需要在一个层(安全层)进行安全检查,而不包括业务层(用于更复杂的检查,)。我读到了所提出的解决方案,其中大多数基本上是相似的,我应该使用令牌提供程序的令牌进行身份验证,角色提供程序使用角色进行授权。授权是通过标记带有授权属性的WebAPI控制器方法来完成的。例如,我有CompaniesController:

代码语言:javascript
复制
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管理的用户。这让我很难决定如何做到这一点,这应该是安全层或业务层的“工作”。

  1. 如果是安全层作业,想法如下:

在令牌中添加CompanyAdmin标识作为声明,并在request (ex )中对照id检查该值。/Companies(2)/GetUsers),如果它匹配返回用户,否则返回状态代码401未经授权。在从授权属性- ex派生的属性类中执行检查。AdvancedAuthorize(“管理,CompanyAdmin {标识}”)括号中的标识意味着对于CompanyAdmin安全层,需要比较从令牌到id值的标识值。

  1. 如果是业务层的工作,想法是:

从令牌获取CompanyAdmin标识,与1.方法相同,或从数据库获取标识,从Authorizations表获得每个用户的授权记录,并检查从URL匹配获得的id是否匹配。业务层方法是从WebAPI控制器调用的,我将在业务层方法中提供id作为参数。

哪种方法更好?或者其他方法比两者都好?

EN

回答 1

Stack Overflow用户

发布于 2015-10-25 15:52:42

在这种情况下,公开的资源将是用户的集合。

代码语言:javascript
复制
GET /companies/{company-id}/users

就我个人而言,我会同意你的第二个选择,因为这似乎更容易实现。

否则,需要在自定义授权筛选器中使用一些业务逻辑,以确定请求“用户”子资源的公司是由经过身份验证的用户管理的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33321257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档