2014-05-14 57 views
1

我創建了一個使用實體框架數據庫的asp.net odata web api項目。這沒什麼特別的,很多教程都採用這種方法。我已經通過用戶和角色保證了這個api,所以只有管理員才能使用web api保存某些內容。基於ASP.NET Web API角色的安全性

我的下一步將是使某些信息只能用於特定角色。例如,如果我有一個具有薪水屬性的實體員工。那麼如何限制(讀取)此屬性的訪問權限僅限於管理員?

編輯

我會嘗試指定我的問題。 鑑於以下控制器:

public class EmployeeController : ApiController 
{ 
    public IQueryable<Employee> Get() 
    { 
     return _Db.Employees; 
    } 
} 

現在我能寫的OData querys aqainst這如http://api.com/employee?$select=FirstName,LastName,Salary&$orderby=Salary

如果我不希望某些人(或角色)的工資訂購我可以實現一個OrderByQueryValidator。 但是我怎樣才能完全隱藏正常用戶的Salary屬性,同時仍然允許管理員選擇它?

因此,鑑於上述控制器,我希望管理員能夠執行這兩個:

http://api.com/employee?$select=FirstName,LastName,Salary&$orderby=Salary 
http://api.com/employee?$select=FirstName,LastName&$orderby=FirstName 

,而普通用戶只能執行此:

http://api.com/employee?$select=FirstName,LastName&$orderby=FirstName 

,並得到一個錯誤當試圖選擇Salary屬性時。

+0

這就是你得到setter和getters的。 – Tarec

+0

如果我要爲這種情況使用getter,我仍然必須返回一個默認值(或null)。然後在我的json或xml響應中,我獲得了默認值的屬性。這對我來說並不合適。 – n3rd

回答

1

使用ViewModel方法。而不是提供Employee對象,創建一個名爲EmployeeViewModel的新類並創建您想要共享的屬性。我還建議創建一個靜態方法來從模型創建一個ViewModel,反之亦然。

+0

儘管@dave在他的回答中提到了限制,但我喜歡ViewModels的方法。但是,我不確定這是否適合。我的控制器返回泛型IQueryable,然後返回一些實體框架類。這樣我就可以充分利用OData的好處,例如$ select和$ expand。所以使用ViewModels可能意味着我必須自己實現很多OData的東西? – n3rd

0

創建自定義授權始終是項目中有趣的部分。我已經實施的最靈活/最乾淨的方式是方面。 我們使用了PostSharp,我們只是創建了一個RequirePermission屬性,可以應用於任何方法。 該屬性具有包含權限的參數,該權限是執行該方法所需的權限。例如:RequirePermission(Permission =「ReadSalary」)。 你可以在屬性中決定當用戶沒有必要的權限時該怎麼做。要麼拋出異常,要麼簡單地跳過方法執行。

您可以在沒有方面的情況下達到相同的行爲,但是您可能會編寫更多的代碼,並且我發現使用方面可以更清晰地解決問題。

更快更簡單的方法可能是針對不同的角色使用不同的ViewModel,但是我只會建議使用類似這樣的東西,如果您確保保持角色數量(如管理員和用戶)低。你可以有一個EmployeeSummary和一個EmployeeDetails視圖模型,並且簡單地根據當前用戶的角色給出正確的一個。