2015-10-24 46 views
0

我正在嘗試在OData WebAPI服務中構建安全體系結構。我們的想法是建立分離架構,安全層應該與WebAPI控制器鬆散耦合,這意味着當我更新WebAPI控制器時,我不需要更新安全層,我只需要以某種方式向安全層提供規則。 我想如果我可以只在一層完成安全檢查,安全層,而不包括業務層進行更復雜的檢查。我正在閱讀有關提議的解決方案,其中大部分基本上都是類似的,我應該使用令牌提供程序中的令牌進行身份驗證,並使用角色提供程序的角色進行授權。授權通過使用Authorize屬性標記WebAPI控制器方法來完成。比如我有CompaniesController:OData中的安全體系結構WebAPI

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只從公司管理該公司管理員的用戶。這使我很難決定如何實現這個目標,並且這應該是安全層或業務層的「工作」。

  1. 如果是安全層的工作,想法是以下幾點:

添加CompanyAdmin標識爲令牌的要求和檢查請求的URL針對的ID值(前/公司(2)/ GetUsers。 ),如果它匹配返回用戶,否則返回狀態碼401未授權。檢查在派生自Authorize屬性的屬性類中執行 - 例如。 [AdvancedAuthorize(「管理員,CompanyAdmin {識別}」)]識別括號意味着對於CompanyAdmin安全層需要標識值從令牌從URL進行比較的值id

  • 如果它是業務層的工作,想法是這樣的:
  • 獲得來自令牌CompanyAdmin標識,相同1.方法或數據庫中獲取的識別,從授權表,我們有記錄與授權爲每個用戶,並檢查URL匹配ID 。業務層方法是從WebAPI控制器調用的,我會在URL中提供id作爲業務層方法中的參數。

    哪種方法更好?或者,也許其他一些方法比兩者都好?

    回答

    0

    這種情況下的公開資源將是用戶的集合。

    GET /companies/{company-id}/users 
    

    就個人而言,我將與你的第二個選項去,因爲它似乎更容易實現。
    否則,在自定義授權過濾器中需要一些業務邏輯,以確定請求'用戶'子資源的公司由認證用戶管理。

    +0

    我同意。我的問題是我不確定如何區分安全層和業務層(業務邏輯代碼)的職責, –