ASP.Net MVC模型Binder - 忽略属性

时间:2015-02-19 05:08:07

标签: c# asp.net asp.net-mvc entity-framework

我有一个使用Entity Framework 6的ASP.Net MVC5站点。

我正在使用基于ASP.Net Identity角色的安全性,该安全性在页面内执行粒度安全检查,以确定某些输入字段是否应该对用户可见。即

@if (User.IsInRole(MyProj.Security.Roles.ViewSocial)) {
   @Html.TextBoxFor(m=> m.SSN)
}

如果用户没有权限,则不会创建输入字段,因此模型绑定器将清除此属性的值。

如何在不显示编辑属性的情况下忽略这些属性?

@Html.HiddenFor()无效,因为我无法在客户端HTML中包含可在源中查看值的标记。

在这种情况下我是否需要自定义模型绑定器?

1 个答案:

答案 0 :(得分:1)

是的,你应该做点什么,因为即使是HTML输入也可以通过现代浏览器中的开发者工具注入,它会被发布到控制器上,你会相信他已获得授权,但实际上并非如此。

是的,您肯定需要阻止恶意用户这样做。有两种选择。

  1. 您可以通过检查是否有权这样做来验证用户的正确逻辑。

  2. 正如您在代码中建议的那样,为此应用自定义模型绑定器,并且只有在获得授权的情况下才设置该属性。

    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);
        }
    }