【发布时间】:2019-12-22 05:42:00
【问题描述】:
就我所知道的提供一些背景信息。我前段时间从这个tutorial 中了解到,即使您在查看使用fiddler 之类的工具更改POST 数据和更改值是多么容易。
在这种情况下你要做的是使用模型绑定来指定你想要编辑的字段列表并忽略其余的
[HttpPost]
[ActionName("Edit")]
public ActionResult Edit_Post(int id)
{
EmployeeBusinessLayer employeeBusinessLayer = new EmployeeBusinessLayer();
Employee employee = employeeBusinessLayer.Employees.Single(x => x.ID == id);
UpdateModel(employee, new string[] { "ID", "Gender", "City", "DateOfBirth" });
^^^ Name isnt updated
if (ModelState.IsValid)
{
employeeBusinessLayer.SaveEmployee(employee);
return RedirectToAction("Index");
}
return View(employee);
}
现在我了解了使用 AspNet.Identity 的身份验证。
- 可以检查用户是否未通过身份验证以将其发送到登录页面。
- 如果用户属于某个
Role,我可以显示个性化菜单。 - 或者检查用户的联系人列表并只显示那些。
但即使您在创建视图之前根据user_id 过滤联系人列表,您也可以使用此类链接访问操作EDIT 和DELETE。
http://MVCDemo/Employee/Edit/1
http://MVCDemo/Employee/Delete/1
而且只要你通过了身份验证,你就可以更改其他用户的数据。
那么,如何将身份验证与 CRUD 操作集成以避免意外操作?
在我看来,要解决这种情况,我必须应用类似于模型绑定示例的东西。 get 和Edit 或Delete post 请求时,首先使用id 从DB 中获取Employee 并比较是否属于当前用户。
但这会在所有函数中创建大量重复代码。
那么处理这个问题的正确方法是什么?
编辑
尽量说清楚。假设我有一个地址簿应用程序。每个用户都有联系人:
contact_id user_id name phone ....
1 1 A
2 1 B
3 1 C
4 2 D
5 2 E
6 2 F
显示联系人的操作使用经过身份验证的user_id 过滤联系人,然后将其发送到视图。
然后您有一个编辑/删除操作,您可以在其中获得contact_id 并处理更新/删除。即使两个用户都有权执行这些操作,他们也不应该影响其他用户的联系人。但正如我所解释的,使用 fiddler 之类的工具非常容易更改页面。
【问题讨论】:
标签: c# asp.net-mvc authentication roles