我正在使用ASP.NET MVC 5开发一个简单的站点,我在编辑模型时遇到了一些问题。
说,模型如下:
public class Model
{
public string Login { get; set; }
public string Password { get; set; }
}
我有两个不同的用户角色,例如Admin和User。现在,我希望用户能够仅编辑登录,而管理员应该能够编辑这两个属性。我使用非常标准的编辑方法,如下所示:
[HttpGet]
public ActionResult Edit(int id)
{
return View(FindModel(id));
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Model model)
{
if (ModelState.IsValid)
{
UpdateModel(model);
return RedirectToAction("Index");
}
return View(model);
}
我的想法:
只有当用户是管理员才能显示密码文本字段,以便用户无法更改密码。但是,据我所知,MVC绑定使用元素的id(或名称,可能)将其绑定到模型,因此用户可以手动创建一个字段来直接修改HTML密码,然后将数据发送到控制器。
我可以为管理员和用户创建两个不同的模型,比如说UserModel
和AdminModel
,控制器中有两个不同的操作,根据用户的角色,我会为用户创建不同的提交按钮和管理员。因此,用户将点击' EditUser'按钮和UserModel
甚至没有内容密码,因此伪造密码并不容易。
我可以检查传递是否已更改且用户是否为User,将显示错误。
其他解决方案是简单地将编辑分成两个动作:分别编辑登录和编辑密码。
任何人都可以就如何解决这个问题以及是否需要保护应用程序免受此类伪造提出任何想法?
答案 0 :(得分:2)
有很多方法可以做到这一点。为了保持代码DRY,我会做类似的事情:
public class EditLoginVM
{
public bool CanEditPassword { get; set; }
public string Login { get; set; }
public string Password { get; set; }
}
在视图中:
@if (Model.CanEditPassword )
{
// Show Password Textbox blah blah :)
}
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(EditLoginVM model)
{
if (ModelState.IsValid)
{
var updateModel = new Model();
updateModel.Login = model.Login;
if (/* user is admin, don't use EditLoginVM.IsAdmin!!!! */)
{
model.Password = model.Password;
}
UpdateModel(model);
return RedirectToAction("Index");
}
model.CanEditPassword = /* reset it just in case of overposting */;
return View(model);
}