【发布时间】:2017-02-07 22:04:47
【问题描述】:
我有一个跟踪属性变化的类
public class Property
{
object _OriginalValue;
object _ProposedValue;
DateTime _ProposedDateTime;
List<Property> _History = new List<Property>();
public object OriginalValue
{
get
{
return _OriginalValue;
}
set
{
_OriginalValue = value;
}
}
public object ProposedValue
{
get
{
return _ProposedValue;
}
set
{
_ProposedDateTime = DateTime.Now;
_ProposedValue = value;
}
}
public bool IsDirty
{
get
{
if (OriginalValue != ProposedValue)
{
return true;
}
else
{
return false;
}
}
}
}
这个属性可以被类使用
public class Customer
{
protected Property _FirstName = new Property();
public string FirstName
{
get
{
return (string)_FirstName.ProposedValue;
}
set
{
_FirstName.ProposedValue = value;
}
}
public object GetOriginalValue(Property Property)
{
return Property.OriginalValue;
}
}
问题是,在将原始值传递给 N 层架构中的客户端时,有没有办法保护原始值?
当客户端将客户传递回服务边界时 - 默认情况下您不能信任该客户端。您需要从数据库重新加载原始值或验证原始值是否未被篡改。当然,我假设我们将使用基于客户当前值的业务逻辑来拒绝或允许更新操作。
例子:
用户插入名为 Bob 的记录。
用户获取名称为 Bob 的记录并将名称更改为 Ted。原始值是 Bob,建议值是 Ted。
用户将客户发送到服务以更新客户。
一切都很好。
*现在将业务规则编码到服务中,说明如果客户的名字是 Ted - 允许更新,否则抛出“无法更新”异常。 *
用户获取名为 Ted 的记录。 用户将名称更改为 Darren。 用户将名称改回 Ted - 系统抛出异常。 用户获取 Ted。用户作弊并使用工具更改客户端上的 OriginalPropertyValue。 服务器不会从数据库中重新获取 OriginalValue,而只是读取来自客户端的 OriginalValue。
用户绕过业务规则。
【问题讨论】:
-
您可能想看看TrackerDog (GitHub repository)。我觉得这会清理你的代码很多:)
-
完全偏离主题。提供的代码只是为了演示这个想法,而不是实际的生产代码。谢谢。
-
欢迎以 TrackerDog 为例发布解决方案。在客户端上进行更改,将更改传递给服务器并验证客户端没有更改数据库设置的任何原始值,或者有办法将数据库中的当前值注入原始值。
-
我建议您使用 TrackerDog 只是为了执行对象更改跟踪,而不是直接回答您的问题。
-
TrackerDog 适用于 xamarin(ios 和 android) - 可通过 .netstandard 1.6 定位?