2016-11-12 3 views
-1

Ich habe einen OData-Controller, der Zeichenfolgenfelder seiner Ausgabe codieren möchte. Das OData-Ausgabeergebnis wird als Klartext zurück an den Client gesendet, aber ich möchte sie vor dem Senden an den Client verschlüsseln.Codieren von Zeichenfolgenfeldern in der OData-Ausgabe

Es scheint, dass der beste Weg ist, einen benutzerdefinierten OData Serializer oder einen Feed Serializer zu verwenden, um mein Ziel zu erreichen. Aber ich bin mir nicht sicher, welche Klasse angepasst werden soll. Ist es besser, einige Methoden zu überschreiben oder meine eigene angepasste Version einer Serialisierungsklasse zu implementieren?

Jede Hilfe wird geschätzt.

+0

Nur HTTPS verwenden, werden alle Daten und der Steinbruch Zeichenfolge verschlüsselt. Wenn Sie Ihre eigene Verschlüsselung durchführen, wie schützen Sie den Schlüssel (halten Sie ihn geheim und teilen Sie ihn zwischen dem Klienten und dem Bediener)? – zaph

+0

HTTPS ist hier keine Option. Der Client darf keine Daten sehen können. Ein Prozess auf dem Client entschlüsselt Daten. Ich stimme zu, dass der Schlüssel in den ausführbaren Dateien des Clients enthalten ist und gefunden werden kann. Aber Anwendung wird an sehr wenigen Orten verwendet, die Hackerfähigkeiten haben sollen. –

+0

Wie wäre es mit der Speicherung der "verschlüsselten" Version Ihrer Daten in der OData-Eigenschaft, anstatt mit Serialisierern herumzuspielen? –

Antwort

0

Finden Sie einen Weg, es zu tun. Ich habe es getan, indem ich Serializer mit Hilfe von this guide angepasst habe. Schlusscode:

using Microsoft.Data.Edm; 
using Microsoft.Data.OData; 
using System.Web.Http.OData.Formatter.Serialization; 

namespace MyProj 
{ 
    public class CustomODataEntityTypeSerializer : ODataEntityTypeSerializer 
    { 
     public CustomODataEntityTypeSerializer(ODataSerializerProvider serializerProvider) : base(serializerProvider) 
     { 
     } 

     public override void WriteObjectInline(object graph, IEdmTypeReference expectedType, ODataWriter writer, ODataSerializerContext writeContext) 
     { 
      //http://odata.github.io/WebApi/#06-03-costomize-odata-formatter 

      if (graph is CompanyDto) 
      { 
       var company = (CompanyDto)graph; 

       company.FirstName = Encrypt(company.FirstName); 
       company.LastName = Encrypt(company.LastName); 
      } 

      base.WriteObjectInline(graph, expectedType, writer, writeContext); 
     } 
    } 
} 

Und diese Klasse:

using Microsoft.Data.Edm; 
using System.Web.Http.OData.Formatter.Serialization; 

namespace MyProj 
{ 
    public class CustomDefaultODataSerializerProvider : DefaultODataSerializerProvider 
    { 
     CustomODataEntityTypeSerializer _customODataEntityTypeSerializer; 

     public CustomDefaultODataSerializerProvider() 
     { 
      _customODataEntityTypeSerializer = new CustomODataEntityTypeSerializer(this); 
     } 

     public override ODataEdmTypeSerializer GetEdmTypeSerializer(IEdmTypeReference edmType) 
     { 
      if (edmType.IsEntity()) 
      { 
       return _customODataEntityTypeSerializer; 
      } 

      return base.GetEdmTypeSerializer(edmType); 
     } 
    } 
} 

Und es wie folgt initialisiert:

  var odataFormatters = ODataMediaTypeFormatters.Create(new CustomDefaultODataSerializerProvider(), new DefaultODataDeserializerProvider()); 
     config.Formatters.InsertRange(0, odataFormatters);