【问题标题】:Security architecture in OData WebAPIOData WebAPI 中的安全架构
【发布时间】: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 管理的公司获取用户。这让我很难决定如何实现这一点,这应该是安全层还是业务层的“工作”。

  1. 如果是安全层工作,思路如下:

将 CompanyAdmin 标识添加为令牌中的声明,并根据请求 URL(例如 /Companies(2)/GetUsers)中的 id 检查该值,如果它与返回的用户匹配,否则返回状态代码 401 Unauthorized。在派生自 Authorize 属性的属性类中执行检查 - 例如。 [AdvancedAuthorize("Admin,CompanyAdmin{identification}")] 括号中的标识表示对于 CompanyAdmin 安全层需要比较来自令牌的标识值和来自 URL 的 id 值

  1. 如果是业务层工作,思路是这样的:

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

哪种方法更好?或者也许其他一些方法比两者都好?

【问题讨论】:

    标签: c# security authorization token asp.net-web-api


    【解决方案1】:

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

    GET /companies/{company-id}/users
    

    就个人而言,我会选择您的第二个选项,因为它似乎更容易实现。
    否则,自定义授权过滤器中将需要一些业务逻辑来确定为其请求“用户”子资源的公司是否由经过身份验证的用户管理。

    【讨论】:

    • 我同意。我的问题是我不确定如何区分安全层和业务层的职责(业务逻辑代码)
    猜你喜欢
    • 2015-12-29
    • 2013-12-16
    • 2013-08-23
    • 2013-09-02
    • 2011-07-03
    • 1970-01-01
    • 2014-06-17
    • 2014-12-11
    • 2011-10-14
    相关资源
    最近更新 更多