2016-11-12 48 views
-1

我有一個OData控制器需要對其輸出的字符串字段進行編碼。 OData輸出結果作爲明確的數據發送回客戶端,但我想在將它們發送給客戶端之前對其進行加密。在OData輸出中編碼字符串字段

看來最好的方法是使用自定義的OData序列化程序或Feed序列化程序來實現我的目標。但我不確定要定製哪個類。重寫某些方法或實現我自己的序列化類的定製版本會更好嗎?

任何幫助表示讚賞。

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