我有一个使用Entity Framework 6的ASP.Net MVC5站点。
我正在使用基于ASP.Net Identity角色的安全性,该安全性在页面内执行粒度安全检查,以确定某些输入字段是否应该对用户可见。即
@if (User.IsInRole(MyProj.Security.Roles.ViewSocial)) {
@Html.TextBoxFor(m=> m.SSN)
}
如果用户没有权限,则不会创建输入字段,因此模型绑定器将清除此属性的值。
如何在不显示编辑属性的情况下忽略这些属性?
@Html.HiddenFor()
无效,因为我无法在客户端HTML中包含可在源中查看值的标记。
在这种情况下我是否需要自定义模型绑定器?
答案 0 :(得分:1)
是的,你应该做点什么,因为即使是HTML输入也可以通过现代浏览器中的开发者工具注入,它会被发布到控制器上,你会相信他已获得授权,但实际上并非如此。
是的,您肯定需要阻止恶意用户这样做。有两种选择。
您可以通过检查是否有权这样做来验证用户的正确逻辑。
正如您在代码中建议的那样,为此应用自定义模型绑定器,并且只有在获得授权的情况下才设置该属性。
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(HomePageModels))
{
HttpRequestBase request = controllerContext.HttpContext.Request;
string title = request.Form.Get("Title");
string day = request.Form.Get("Day");
string month = request.Form.Get("Month");
string year = request.Form.Get("Year");
if(User.IsInRole("Admin"))
{
string SSN = request.Form.Get("SSN");
}
return new HomePageModels
{
Title = title,
Date = day + "/" + month + "/" + year,
SSN = SSN
};
//// real time HomePageModels instance should be loaded from database here to avoid saving null if person is not authorized to do so
}
else
{
return base.BindModel(controllerContext, bindingContext);
}
}