Kontextale Serialisierung vom WebApi-Endpunkt basierend auf Berechtigungen

8

Ich benutze die Asp.Net Web API. Ich möchte in der Lage sein, bestimmte Felder auf den Antwortobjekten basierend auf den Zugriffsrechten der verbundenen Clients herauszufiltern.

Beispiel:

%Vor%

Beim Zurückgeben von Daten sollte das Feld Wibble nur zurückgegeben werden, wenn der aktuelle Benutzerkontext den Wert von "Uberlord" erfüllen kann.

Es gibt drei Wege, die ich erkunde, aber ich habe keine funktionierende Lösung:

  1. Ein benutzerdefinierter WebApi MediaTypeFormatter.
  2. Ein benutzerdefinierter json.net IContractResolver.
  3. Eine Art AOP-Wrapper für Controller, die das Antwortobjekt
  4. manipulieren

Mein Problem mit diesen sind:

  • Der benutzerdefinierte Formatierer fühlt sich nicht wie der richtige Ort dafür an, sondern könnte die einzige Option sein.
  • Der benutzerdefinierte JSON-Serializer hätte keinen Zugriff auf den aktuellen Kontext, daher müsste ich das ausführen.
  • Bei den ersten beiden Optionen würden Sie spezifische Implementierungen für jedes Antwortformat, json, xml, ein beliebiges benutzerdefiniertes Format usw. benötigen. Wenn ein anderer Antworttyp unterstützt wird, ist ein benutzerdefinierter Formatierer / Serializer erforderlich, um vertrauliche Daten zu verhindern undicht.
  • Der AOP-Controller-Wrapper würde viel Reflektion erfordern.

Ein zusätzlicher Bonus wäre das Entfernen von Werten aus den Feldern eines eingehenden Anforderungsobjekts mit demselben Mechanismus.

Habe ich einen offensichtlichen Haken übersehen? Wurde das auf andere Weise gelöst?

    
Bronumski 23.04.2013, 14:33
quelle

2 Antworten

2

Es war tatsächlich viel einfacher als ich zuerst dachte. Was ich nicht bemerkt habe ist, dass die DelegatingHandler verwendet werden kann um die Antwort sowie die Anfrage in der Web-API-Pipeline zu manipulieren .

Lebenszyklus einer ASP.NET-Web-API-Nachricht

  

Delegierender Handler

     

Delegierende Handler sind ein Erweiterungspunkt in der Nachrichtenpipeline, mit dem Sie die Anforderung massieren können, bevor Sie sie an den Rest der Pipeline weitergeben. Die Antwortnachricht muss auf ihrem Rückweg auch den delegierenden Handler durchlaufen, sodass jede Antwort an diesem Erweiterungspunkt überwacht / gefiltert / aktualisiert werden kann.

     

Delegieren von Handlern, falls erforderlich, kann den Rest der Pipeline auch umgehen und zurück senden und HTTP-Antwort selbst.

Beispiel

Hier ist eine Beispielimplementierung eines DelegatingHandlers, der das Antwortobjekt entweder manipulieren oder ganz ersetzen kann.

%Vor%     
Bronumski 04.07.2013, 13:55
quelle
0

Ich habe eine ähnliche Frage in den Arbeiten hier: ASP.NET WebAPI bedingte Serialisierung basierend auf Benutzerrolle

Eine vorgeschlagene Lösung, die ich entwickelt habe, besteht darin, meinen ApiController von einem BaseApiController zu erben, der die Initialisierungsfunktion außer Kraft setzt, um den entsprechenden Formatierer auf der Grundlage der Benutzerrolle festzulegen. Ich habe nicht entschieden, ob ich diesen Weg noch gehen werde, aber vielleicht wird es für dich funktionieren.

%Vor%     
Zach 03.07.2013 16:03
quelle