我的 Linq-To-Sql 映射中有一个用户对象。它有一个密码属性,我想在用户提交时反序列化 - 例如,在登录期间。不过,我从不想将此属性传回给用户,因为它将包含实际密码的加密版本,并且我宁愿不公开有关密码或加密方法的任何信息。有没有办法在对象范围内告诉 Linq-To-Sql 在返回 User 对象时永远不要传递 Password 属性?
问问题
222 次
2 回答
2
我使用 https 进行加密,主要是因为在访问服务时,默认情况下您会强制执行加密,这样可以节省客户端代码。不过,您有几个可能的答案:
- 当您从 WCF 端返回用户对象时,请清除密码。(您可以更改对象密码的值,只是不保存更改..然后将对象返回给客户端)
- 为您的登录响应使用自定义对象,该对象仅返回您的客户的必要信息。
- 使用 AutoMapper 之类的 nuget 包实现数据传输对象模式。
如果您没有对密码进行加盐和哈希处理,请考虑一下。
于 2013-09-24T18:02:12.107 回答
0
在我不想序列化对象的情况下,最好挂接到 OnSerializing 事件中。由于我使用的是 Linq-To-Sql,OnSerializing 事件已经被我的 DataContext 的 Designer.cs 捕获,用于跟踪延迟加载实体引用的序列化状态。添加另一个装饰有的函数[OnSerializing]
会在 System.ServiceModel.Activation 中引发错误,因此我必须找到另一条路线。这是我的解决方案:
修改 DataContext.designer.cs
在 DataContext.designer.cs 中,我添加了
[global::System.Runtime.Serialization.OnSerializingAttribute()]
[global::System.ComponentModel.EditorBrowsableAttribute(EditorBrowsableState.Never)]
public void OnSerializing(StreamingContext context)
{
this.serializing = true;
// custom function to handle my logic
this.ClearPassword();
}
将方法添加到我的自定义类定义
在我的 User.cs 文件中,我有一个部分类定义。因此,我需要做的就是将 ClearPassword 方法添加到我的部分类定义中:
partial class User
{
private void ClearPassword()
{
this.Password = null;
}
//* OTHER CODE *//
}
现在,无论我如何与 User 对象进行交互,密码都不会按照需要传递给客户端。
于 2013-09-24T19:05:12.777 回答