我有一个Note域对象,它属于Document对象。只有Document的所有者才能添加Notes,所以在Document类中有一个canUserAccess()方法。在我的服务层,我可以调用canUserAccess()来确保用户只将Notes添加到他们拥有的文档中。
这适用于创建,但我的注释编辑操作遇到了问题。在post上,viewmodel映射到Note对象,为其提供DocumentID。问题是,恶意用户可以发送他们确实拥有权限的DocumentID,从而编辑属于他们没有的Document的Note。在我的服务层中,我无法可靠地使用提供的DocumentID,但我需要获取相关的DocumentID以验证用户是否可以编辑Note。这是一个例子:
public void editNote(Note note)
{
note.Document = documentRepository.Find(note.DocumentID);
if(note.Document.canUserAccess())
}
我如何解决这个问题?我似乎需要避免使用编辑视图模型传递DocumentID,但如何在服务层中保留相关文档?可能有一个非常简单的解决方案,我只是把自己绑在圈子里!
答案 0 :(得分:0)
您可以使用BindAtrribute为模型或操作方法执行此操作,方法是添加包含您要绑定的属性的白名单:
为模型
[Bind(Include="NoteText,NoteTitle")]
public Model{}
用于操作方法
public ViewResult Edit([Bind(Include="NoteText,NoteTitle"]Note note)){}
或使用黑名单列出您不想绑定的属性:
[Bind(Exclude="DocumentID")]
public Model{}
我个人会将白名单与模型类一起使用。您可能会发现this文章很有趣。发布不足的最后一部分就是你的情况。
然后你没有传递documentID,但在你的行动中你可以这样做:
public ViewResult Edit(Note note)
{
Note updateNote = nodesRep.Get(note.noteID);
if(updateNote.Document.canUserAccess())
{
//replace the values of the updateNote
//you can place this line in your base Repository class
context.Entry<Note>(updateNote).CurrentValues.SetValues(note); //I assume EF 4.1
}
}