【发布时间】:2016-07-21 13:51:43
【问题描述】:
在一个 ASP.NET Web API 项目中,我想加密所有响应中的所有实体 ID,并解密所有请求中的加密值。
(注意:我知道如何加密/解密数据,这不是我的问题。)
我认为如果我只在响应/请求中使用自定义属性装饰我需要加密/解密的属性会很好。
这就是我喜欢它的工作方式:
public class Person
{
[EncryptDecrypt]
public int PersonID {get; set;}
public string Name {get; set;}
public IEnumerable<Order> Orders {get; set;}
}
public class Order
{
[EncryptDecrypt]
public long OrderID {get; set;}
public string Title {get; set;}
public float Price {get; set;}
}
然后在 Web API 方法中:
// GET: api/persons/xhj$j78dPs (xhj$j78dPs is an encrypted PersonID)
public Person Get([EncryptDecrypt]int personId)
{
// Now, I expect personId to be a normal ID, like: 187356
Person person = _repository.GetPerson(personId);
return person;
}
上述 Web API 的期望响应是:
{
"personId": "xhj$j78dPs",
"name": "Joe Williams",
"orders": [
{
"orderId": "a#jd75mlzed0ihd",
"title": "Buying a new item",
"price": 19.99
}
]
}
这是另一个例子,这次是用于 PUT 动词的 Web API:
/* PUT Request body: */
{
"orderId": "a#jd75mlzed0ihd",
"title": "Buying a new item - edited",
"price": 13.00
}
相关的Web API方法:
// PUT: api/persons/xhj$j78dPs/orders/ (xhj$j78dPs is an encrypted PersonID)
public void Put([EncryptDecrypt]int personId, Order editedOrder)
{
// I expect personId to be a normal ID, like: 187356
// I expect editedOrder.OrderID to be a normal ID, like: 10000089765
_repository.UpdateOrder(personId, editedOrder);
}
如何开发[EncryptDecrypt] 属性?
[EncryptDecrypt] 实际上应该是JsonConverter attribute 吗?或者我应该开发自定义Media Formatter 或模型绑定器或值提供者或参数绑定器?我很困惑。
【问题讨论】:
-
这样的东西有用吗? codemag.com/article/0307041
-
请参阅How can I encrypt selected properties when serializing my objects?,了解如何处理序列化结束。您必须对其进行一些调整,因为您希望它适用于数字属性而不是字符串。对于 Web API 参数处理,我认为您希望创建自定义 Web API
IValueProvider和ValueProviderFactory。看这里:asp.net/web-api/overview/formats-and-model-binding/…
标签: asp.net-mvc asp.net-web-api json.net asp.net-web-api2