我很困惑为什么在视图中使用域对象是不好的实践?我被告知这可能会导致模型绑定攻击,但我不确定这是什么或者如何进行。我也不太明白将属性复制到视图模型中如何解决此问题。
谢谢。
isAdmin,isDeleted,isAuthorized
或其他安全或敏感信息,即使您仅以只读状态显示它,也会在视图/HTML中公开该属性名称,从而给一些“聪明的用户”玩弄您的POST操作的机会,如果您没有采取正确的预防措施,这可能会导致安全漏洞。ViewModel <-> Model
(域对象)的重新映射,在此重新映射中,您可以确保分配仅为特定用户所需的内容,例如:if(CurrentUser.IsAdmin)
{
//Assign just if the current user is admin
Model.IsDeleted = ViewModel.Delete;
}
您的域对象可能包含敏感信息,例如IsAuthenticated
,UserRoles
等,这些信息不应该直接受到客户端代码的影响。
如果您的域对象除了要在屏幕上显示的属性之外没有其他内容,则您可能根本不需要域模型。
用户可以修改您域对象中的任何字段。这是ASP MVC中模型绑定的工作方式。他们只需要在发布之前修改表单即可。例如,您可以使用Chrome / Firefox开发人员工具。
我已经写了一篇博客:http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/
在视图中使用领域模型并不总是不好的。 模型绑定攻击是提供了一些不应该被编辑的属性值。 为了防止模型绑定攻击,需要在操作参数上标记BindAttribute,并指定允许绑定的属性列表中的Exclude或Include(更好)。