0

我的 Linq-To-Sql 映射中有一个用户对象。它有一个密码属性,我想在用户提交时反序列化 - 例如,在登录期间。不过,我从不想将此属性传回给用户,因为它将包含实际密码的加密版本,并且我宁愿不公开有关密码或加密方法的任何信息。有没有办法在对象范围内告诉 Linq-To-Sql 在返回 User 对象时永远不要传递 Password 属性?

4

2 回答 2

2

我使用 https 进行加密,主要是因为在访问服务时,默认情况下您会强制执行加密,这样可以节省客户端代码。不过,您有几个可能的答案:

  1. 当您从 WCF 端返回用户对象时,请清除密码。(您可以更改对象密码的值,只是不保存更改..然后将对象返回给客户端)
  2. 为您的登录响应使用自定义对象,该对象仅返回您的客户的必要信息。
  3. 使用 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 回答