我有一个接受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"
}
我希望模型验证会抱怨“名称”字段不存在。
如何检查非法字段?
答案 0 :(得分:0)
您可以使用ActionFilter
和Reflection
将请求正文内容与模型字段进行比较。如果存在意外字段,请手动添加模型错误,并且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
}