我有一个连接到加密数据源的Web API OData
控制器。我希望将数据作为加密方式发送回客户端,但不希望从客户端获取搜索/过滤功能。需要客户端可以查询数据,就像它是未加密的数据一样。我的意思是客户端不要加密搜索条件然后传递给odata。
我发现没有比类型序列化器更好的方法来做到这一点。我试图自定义它并加密那个地方的数据。它适用于某些情况但不适用于所有情况。当odata直接在浏览器中调用时(不在客户端应用程序中),它不起作用。当客户决定只获取特定字段时,它不再起作用。
当从odata获取加密数据时,客户端将解密数据。
我的问题是注入加密机制的正确位置?有没有更好的解决方案?
以下显示了我目前正在做的事情。我也问了类似的问题here,here,here,here和here,但确实得到了我的问题的答案。
答案 0 :(得分:0)
如果我理解正确,您希望返回具有加密或解密属性的模型,具体取决于您的ODATA模型的属性,具体取决于客户端请求设置。因此输出可能如下所示:
{
"Name" : "clearText"
,
"Value" : "cryptText"
}
不是在序列化程序级别重新加密数据,而是在ODATA控制器调用的业务逻辑中实际执行该操作(或者如果你没有分离业务逻辑,则在控制器本身中执行)。
这种方法的好处是您仍然拥有所有信息(查询,完整模型),而加密传出序列化程序中的数据也会导致将加密/解密密钥分成不同的位置。
如果您的流程类似于此
CryptEntity cryptEntity = db.Set<T>.FirstOrDefault(e => e.Id == key);
ClearEntity clearEntity = cryptEntity.Decrypt();
// perform search depending on query settings
cryptEntity = clearEntity.Encrypt();
您可以使用AutoMapper执行转换并为其提供特定的构造函数或类型转换器,而不是在实体上使用(扩展)方法并进一步从ODATA逻辑和实体中抽象出业务逻辑:
var cryptEntity = Mapper.Map<CryptEntity>(clearEntity);
如果这不能解答您的问题或没有完全解决您的问题,请详细说明并举例说明。