如何在ASP.NET Core接口中屏蔽NewtonsoftJson错误响应的DTO敏感细节
解决方案
你可以通过自定义模型验证响应或者全局配置Newtonsoft.Json反序列化错误处理两种方式,屏蔽错误信息中的敏感路径内容:
方案1:全局自定义模型验证错误响应(推荐)
该方案可以统一处理所有接口的参数验证错误返回格式,直接替换掉包含敏感信息的原始错误消息:
services.AddControllers() .AddNewtonsoftJson(s => s.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver()) .ConfigureApiBehaviorOptions(options => { options.InvalidModelStateResponseFactory = context => { var errorList = new List<string>(); foreach (var state in context.ModelState.Values) { foreach (var error in state.Errors) { // 检测是否为反序列化类错误,统一返回通用提示 if (error.ErrorMessage.Contains("deserialize", StringComparison.OrdinalIgnoreCase)) { errorList.Add("请求JSON格式错误,请检查参数结构是否符合接口要求"); } else { // 其他验证错误(比如必填、邮箱格式错误等)保留原提示 errorList.Add(error.ErrorMessage); } } } return new BadRequestObjectResult(new { title = "参数验证失败", status = 400, errors = errorList }); }; });
方案2:配置Newtonsoft.Json全局反序列化错误处理
直接在JSON解析阶段捕获异常,替换错误消息,避免原始异常信息流入验证层:
services.AddControllers() .AddNewtonsoftJson(s => { s.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); s.SerializerSettings.Error = (sender, args) => { // 替换原始错误消息,屏蔽项目内部类型信息 args.ErrorContext.ErrorMessage = "请求数据解析失败,请检查JSON格式是否正确"; args.ErrorContext.Handled = true; }; });
注意:方案2会捕获所有Newtonsoft.Json的序列化/反序列化错误,如果需要区分不同错误类型,可以在Error事件中加条件判断,只替换包含敏感信息的错误消息即可。
内容的提问来源于stack exchange,提问作者V K
相关产品推荐
相关产品推荐

