簡體   English   中英

基於ASP.NET Web API角色的安全性

[英]ASP.NET Web API role based security

我創建了一個使用實體框架數據庫的asp.net odata Web api項目。 這沒什么特別的,許多教程都采用這種方法。 我已經使用用戶和角色保護了此api,因此只有管理員才能實際使用Web api保存某些內容。

我的下一步將是使某些信息僅可用於特定角色。 例如,如果我將擁有一個具有Salary屬性的實體Employee。 那么,我將如何限制(讀取)對此屬性的訪問權限僅限於管理員?

編輯

我將嘗試說明我的問題。 給定以下控制器:

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

現在,我可以在此附近編寫odata查詢,例如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屬性時收到錯誤消息。

使用ViewModel方法。 創建一個名為EmployeeViewModel的新類並創建您要共享的屬性,而不是給Employee對象。 我建議還創建一個靜態方法,以從Model創建ViewModel,反之亦然。

創建自定義授權始終是項目中一個有趣的部分。 我實現它的最靈活/最簡潔的方法是使用方面。 我們使用了PostSharp ,我們只是創建了RequirePermission屬性,該屬性可以應用於任何方法。 該屬性具有一個包含權限的參數,該參數是執行該方法所必需的。 例如:RequirePermission(Permission =“ ReadSalary”)。 您可以在屬性中決定用戶沒有所需權限時的處理方式。 要么拋出異常,要么直接跳過方法執行。

沒有方面,您可能會達到相同的行為,但是您可能會編寫更多代碼,而我發現使用方面可以解決問題。

更快,更輕松的方法可能是為不同的角色使用不同的ViewModel,但是如果您確保將角色(例如admin和user)的數量保持在較低水平,我只建議使用類似的方法。 您可以擁有一個EmployeeSummary和一個EmployeeDetails視圖模型,並可以根據當前用戶的角色簡單地交出正確的視圖模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM