在 .net core 的自定义模型绑定器中验证嵌套的 Json 对象

问题描述

我在我的 .NET core 3.1 api 中创建了一个自定义模型绑定器来验证所有 JSON 参数(通过这篇文章 How to validate json request body as valid json in asp.net core 的帮助)。出于安全考虑,我正在检查所有传入的请求参数与实际模型属性(实体模型)以避免参数调整(在发送 api 请求时添加附加属性)。这对于普通的 json 请求工作正常,但如果我有一个嵌套的 json(嵌套实体模型),那么它只验证主要属性(内部属性未验证)

示例:

对于非嵌套实体模型,代码工作正常,但如果它是像波纹管这样的嵌套模型

public class dep
{
public int depId { get; set; }
public string depName { get; set; }
}
public class EmpModel
{
public dep DepDetails { get; set; }
public string empName { get; set; }
}

该代码将仅验证主要属性,如 DepDetails、empName,但不会检查 DepDetails 的内部属性

public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null) { throw new ArgumentNullException(nameof(bindingContext)); }
        var modelName = bindingContext.BinderModelName ?? "XJson";
        var modelType = bindingContext.ModelType;

        // create a JsonTextReader
        var req = bindingContext.HttpContext.Request;
        var raw = req.Body;
        if (raw == null)
        {
            bindingContext.ModelState.AddModelError(modelName,"invalid request body stream");
            bindingContext.Result = ModelBindingResult.Failed();
            return Task.CompletedTask;
        }
        JsonTextReader reader = new JsonTextReader(new StreamReader(raw));

        try
        {
            var jsonT = (JObject)JToken.Load(reader,this._loadSettings);
            
            JObject reqeJson = JObject.Parse(jsonT.ToString());
            var RequestParameters = reqeJson.Properties().ToList();
            var actualParam = bindingContext.ModelMetadata.Properties.ToList();
             
            //checking for additional parameters in input
            //Here I am checking if any additional property is appended with the data and for the 
            //above model in both actualParam and RequestParameters I will get only 2 instead of 3

            bool flag = true;
            foreach (var obj in RequestParameters)
            {
                if(!actualParam.Any(item => item.Name.ToUpper() == obj.Name.ToUpper())){
                    flag = false;
                    break;
                }
                JObject tmp = JObject.Parse(obj.ToString());
            };

            if (!flag)
            {
                bindingContext.ModelState.AddModelError(modelName,"Additional Data is present in Request");
                bindingContext.Result = ModelBindingResult.Failed();
                return Task.CompletedTask;
            }
            var o = jsonT.ToObject(modelType);
            bindingContext.Result = ModelBindingResult.Success(o);
        }
        catch (Exception e)
        {
            bindingContext.ModelState.AddModelError(modelName,e.ToString());  
            bindingContext.Result = ModelBindingResult.Failed();
        }
        return Task.CompletedTask;
    }

真正的问题是 RequestParameters 的内容,actualParam 是 {DepDetails,empName} 但我应该得到 {depId,depName,empName}

如果此方法不正确,请帮助我提供一些替代方法。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...