2017-05-31 24 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のための定期的な問題です。 1つの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)); 
関連する問題