我正在嘗試在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只從公司管理該公司管理員的用戶。這使我很難決定如何實現這個目標,並且這應該是安全層或業務層的「工作」。
- 如果是安全層的工作,想法是以下幾點:
添加CompanyAdmin標識爲令牌的要求和檢查請求的URL針對的ID值(前/公司(2)/ GetUsers。 ),如果它匹配返回用戶,否則返回狀態碼401未授權。檢查在派生自Authorize屬性的屬性類中執行 - 例如。 [AdvancedAuthorize(「管理員,CompanyAdmin {識別}」)]識別括號意味着對於CompanyAdmin安全層需要標識值從令牌從URL進行比較的值id
- 如果它是業務層的工作,想法是這樣的:
獲得來自令牌CompanyAdmin標識,相同1.方法或數據庫中獲取的識別,從授權表,我們有記錄與授權爲每個用戶,並檢查URL匹配ID 。業務層方法是從WebAPI控制器調用的,我會在URL中提供id作爲業務層方法中的參數。
哪種方法更好?或者,也許其他一些方法比兩者都好?
我同意。我的問題是我不確定如何區分安全層和業務層(業務邏輯代碼)的職責, –