阻止用户编辑相关记录

时间:2012-01-04 20:39:38

标签: asp.net-mvc

我有一个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,但如何在服务层中保留相关文档?可能有一个非常简单的解决方案,我只是把自己绑在圈子里!

1 个答案:

答案 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
  }  
}