2016-11-12 11 views
-1

出力の文字列フィールドをエンコードするODataコントローラがあります。 ODataの出力結果は、クリアデータとしてクライアントに送り返されますが、クライアントに送信する前に暗号化します。OData出力のエンコード文字列フィールド

私の目標を達成するために、カスタマイズされたODataシリアライザまたはフィードシリアライザを使用するのが最善の方法です。しかし、どのクラスをカスタマイズするのかはわかりません。いくつかのメソッドをオーバーライドするか、独自のカスタマイズされたバージョンのシリアライズクラスを実装する方が良いでしょうか。

何か助けていただければ幸いです。

+0

ちょうどHTTPSを使用して、すべてのデータと採石場の文字列が暗号化されます。独自の暗号化を行う場合、どのように鍵を保護しますか(秘密を保持し、クライアントとサーバの間で共有します)? – zaph

+0

HTTPSはオプションではありません。クライアントはデータを見ることができません。クライアント上のプロセスはデータを解読します。私は、キーがクライアントの実行ファイルにあり、見つけられるということに同意します。しかし、アプリケーションは、ハックスキルを持つと思われる非常に少数の場所で使用されます。 –

+0

シリアライザを使用するのではなく、データの「暗号化」バージョンをODataプロパティに格納する方法はありますか? –

答えて

0

これを行う方法を見つける。私はthis guideの助けによってシリアライザをカスタマイズすることによってそれをしました。最終的なコード:

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); 
     } 
    } 
} 

そして、このクラス:

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); 
     } 
    } 
} 

そして、次のようにそれを初期化:

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