2017-05-31 48 views
0

我在我的WebAPI中遇到了一個設計問題,我沒有看到任何標準方法來解決Microsoft文檔中的這個問題。ASP.NET WebAPI基於角色的SELECT

問題是:想象一下,我有一個控制器「TaskController」,其中有一個GetAllTask​​s方法,它返回一個包含數據庫中所有任務的方法。

問題是,這些任務有不同的類型,所以取決於我的WebAPI的用戶角色我需要只選擇某些類型的任務。

該類型不直接鏈接到特定角色,每個角色都可以使用具有可以看到的任務類型的XML文件進行配置,並且可以更改此XML文件。例如:

<RolAdmin> 
<TaskTypes> 
<type>1</type> 
<type>2</type> 
<type>4</type> 
</TaskTypes> 
</RolAdmin> 

<RolUser> 
<TaskTypes> 
<type>1</type> 
</RolUser> 

這是一個反覆出現的問題,適用於不同的控制器,不僅適用於TasksController。你如何解決它,而不使用每個SELECT的if?

回答

0

配置它並不重要,但您也可以使用AspNetRoleClaims添加特定於角色的聲明。這些聲明會自動添加到User.Identity。

在控制器中,您可以讀取配置。使用User.Identity.IsInRole()來獲取用戶讀取任務類型的角色。

您也可以閱讀索賠。請注意,您需要過濾特定類型,否則會返回所有聲明。喜歡的東西:

var identity = (ClaimsIdentity)User.Identity; 
IEnumerable<Claim> taskTypes = identity.Claims.Where(c => c.ValueType == "TaskType"); 

在這兩種情況下,你可用的任務類型的列表結束。您可以使用可用任務類型的篩選器來擴展查詢,如下所示:

query = query.Where(q => taskTypes.Contains(q.TaskType));