如何在模型验证中验证非法字段

时间:2019-06-04 09:52:46

标签: .net asp.net-core-webapi core

我有一个接受PersonDto的.NET Core 2.2 Web-api,正在通过模型验证对其进行验证,但是它不检查非法字段。它仅检查匹配字段是否有效。

我想确保提供的JSON仅包含Dto(类)中的字段。

public class PersonDto
  {
    public string firstname { get; set; }
    public string lastname { get; set; }
  }

我的控制器看起来像这样:

public async  Task<ActionResult<Person>> Post([FromBody] PersonDto personDto)
{
    // do things
}

我向它发送了不正确的字段(名称在我的dto中不存在)并且ModelState有效。

{
  "name": "Diego"
}

我希望模型验证会抱怨“名称”字段不存在。

如何检查非法字段?

1 个答案:

答案 0 :(得分:0)

您可以使用ActionFilterReflection将请求正文内容与模型字段进行比较。如果存在意外字段,请手动添加模型错误,并且ModelState.IsValid将为false。

1。创建一个ActionFilter

public class CompareFieldsActionFilter : ActionFilterAttribute
{

    public override void OnActionExecuting(ActionExecutingContext context)
    { 
        //get all fields name
        var listOfFieldNames = typeof(PersonDto).GetProperties().Select(f => f.Name).ToList();

        var request = context.HttpContext.Request;
        request.Body.Position = 0;

        using (var reader = new StreamReader(request.Body))
        {
            //get request body content
            var bodyString = reader.ReadToEnd();                

            //transfer content to json
            JObject json = JObject.Parse(bodyString);

            //if json contains fields that do not exist in Model, add model error                
            foreach (JProperty property in json.Children())
            {
                if (!listOfFieldNames.Contains(property.Name))
                {
                    context.ModelState.AddModelError("Filed", "Field does not exist");                      
                }
            }
        }
        base.OnActionExecuting(context);
    }
}

2。对您的操作使用过滤器:

[HttpPost]
[CompareFieldsActionFilter]
public async  Task<ActionResult<Person>> Post([FromBody] PersonDto personDto)
{
   if (ModelState.IsValid)
    {
       // do things
    }
  // do things
}