我有一个跟踪属性更改的类
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。
用户绕过业务规则。