2017-05-31 3 views
0

Ich bin mit einem Designproblem in meinem WebAPI konfrontiert und ich sehe keinen Standardansatz, um dieses Problem in der Microsoft-Dokumentation anzugehen.ASP.NET WebAPI Rollenbasiert AUSWÄHLEN

Das Problem ist das folgende: Stellen Sie sich vor, ich habe einen Controller "TaskController", mit einer Methode GetAllTasks, die eine Methode mit allen Aufgaben in der Datenbank zurückgibt.

Das Problem ist, dass diese Aufgaben verschiedene Typen haben, so dass abhängig von der Benutzerrolle meiner WebAPI ich nur bestimmte Arten von Aufgaben SELECT.

Der Typ ist nicht direkt mit einer bestimmten Rolle verknüpft, jede Rolle wird z. B. mit einer XML-Datei mit dem Typ der Aufgaben konfiguriert, die sie sehen können, und diese XML-Datei kann geändert werden. Etwas wie:

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

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

Dies ist ein wiederkehrendes Problem für verschiedene Controller und nicht nur für TasksController. Wie würdest du es lösen ohne ein if für jeden einzelnen SELECT zu verwenden?

Antwort

0

Es spielt keine Rolle, wie Sie es konfigurieren, aber Sie können auch AspNetRoleClaims verwenden, um rollenspezifische Ansprüche hinzuzufügen. Diese Ansprüche werden automatisch zur User.Identity hinzugefügt.

In der Steuerung können Sie die Konfiguration lesen. Verwenden Sie User.Identity.IsInRole(), um die Rolle des Benutzers zum Lesen der Aufgabentypen zu erhalten.

Sie können auch die Ansprüche lesen. Bitte beachten Sie, dass Sie nach einem bestimmten Typ filtern müssen, da sonst alle Ansprüche zurückgegeben werden. Etwas wie:

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

In beiden Fällen erhalten Sie eine Liste der verfügbaren Aufgabenarten. Sie können die Abfrage nur mit einem Filter auf verfügbare Aufgabentypen erweitern:

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