小编Nei*_*ett的帖子

确定在.NET MVC请求中何时发送无效的JSON密钥/值对

我有一个客户端与MVC应用程序接受原始JSON请求.ModelBinder将传入的键/值对映射到Controller Model属性,没有问题.

问题是他们想要在发送无效的键/值对时抛出错误,并且在我的生命中我无法找到原始传入数据.

例如,如果我有一个带有字符串属性的模型,MName但是在他们发送的JSON请求中"MiddleName":"M",ModelBinder会抛出这个无效密钥并将该MName属性留空.这不会引发错误并ModelState.IsValid返回true.

我知道我可以在[Required]属性上抛出一个属性,但这也不对,因为该属性可能存在空值,并且仍然没有遇到检测不属于的键/值对的问题.

这不是过度发布的问题; 我不是想阻止传入的值绑定到模型.我正在尝试检测传入的值何时没有映射到模型中的任何内容.

由于这些值是作为application/json在请求体中出现的,我甚至没有运气,甚至可以计算或枚举原始请求数据.我可以从中提取名称/值对,ModelState.Keys但只包括已成功映射的字段.这些密钥都不在Request[]集合中.

是的,这是在ASP.NET MVC 5中,而不是WebApi.WebAPI是否以不同的方式处理此问题?

有任何想法吗?

例:

application/json:{"FName":"Joe","MName":"M","LName":"Blow"}

public class PersonModel
{
    public string FName { get; set; }
    public string LName { get; set; }
}

public class PersonController() : Controller
{
    public ActionResult Save(PersonModel person)
    {
        if(ModelState.IsValid) // returns true
        // do things
        return View(person)
    }
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc json asp.net-mvc-5

7
推荐指数
1
解决办法
556
查看次数

属性[Bind(Exclude ="")]无法防止过度发布

阻止MVC 4过度发布的最佳方法是什么?

根据MS消息来源,[Bind]属性应该是通过阻止传入的表单值进入数据库来防止过度发布的最简单方法.使用最新版本的MVC和EF,这似乎没有像预期/广告一样工作,除非我遗漏了一些重要的东西.

Wrox Professional ASP.NET MVC 4(Jon Galloway的第7章)开始,以下类应该防止过度发布:

[Bind(Exclude="IsAdmin")]
public class User
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public bool IsAdmin { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是所有[Bind]属性都会阻止表单提交值绑定到模型.然后,模型具有空白/默认值,并将其写回数据库.在这种情况下,它会确保IsAdmin = false每次使用此模型调用.SaveChanges().任何"真实"值都会被覆盖.这是一个巨大的安全故障.

替代语法 - 将[Bind]放置在Edit controller action参数中 - 完全相同:

public ActionResult Edit([Bind(Exclude = "IsAdmin")] User user)
Run Code Online (Sandbox Code Playgroud)

当调用.SaveChanges()时,所有"真实"值都会被覆盖,这与K. Scott Allen关于该主题的博客文章相矛盾:http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-对质量分配,在-ASP净mvc.aspx

唯一的选择似乎是一系列专用的ViewModel,它们都与Automapper相连.虽然安全,但这似乎是一个巨大的头痛,尤其是:

  • 您可能对"创建","编辑","索引"和"详细信息"操作有不同的要求,需要使用不同的ViewModel
  • 您可能需要在属性上显示一些只读字段(例如"编辑"操作上的CreatedBy),因为它们是由"创建"操作更新的,因此它们不具有属性上的[ReadOnly]属性

我知道有人会回应说你永远不应该将数据模型绑定到视图,但这是默认的模板行为以及它在几乎所有文档中的显示方式.此外,MVC + EF应该让生活变得更轻松,而不是更难,并且使用AutoMapper连接的ModelView类的海洋并不是我认为更容易的.

那么有谁知道如何使[Bind]功能像宣传的一样?

c# asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5

3
推荐指数
1
解决办法
6549
查看次数