我有一个接受模型UpdateProductCommand的控制器,如下所示:
public IHttpActionResult UpdateProduct(UpdateProductCommand command)
{
command.AuditUserName = this.RequestContext.Principal.Identity.Name;
// ....
}
对于安全问题,永远不应将AuditUserName
字段设置在外部(来自API调用)。
如何从JSON请求中删除(或截断)此字段的值?
答案 0 :(得分:0)
可以通过以下ModelBinder
:
using Newtonsoft.Json.Linq;
public class FieldRemoverModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
string content = actionContext.Request.Content.ReadAsStringAsync().Result;
JObject json = JObject.Parse(content);
JToken property = json.GetValue(bindingContext.ModelName, StringComparison.OrdinalIgnoreCase);
property?.Parent.Remove();
bindingContext.Model = json.ToObject(bindingContext.ModelType);
return true;
}
}
像这样使用:
public IHttpActionResult UpdateProduct(([ModelBinder(typeof(FieldRemoverModelBinder), Name = nameof(UpdateProductCommand.AuditUserName))]UpdateProductCommand command)
{
// here command.AuditUserName will always be empty, no matter what's in json
答案 1 :(得分:0)
这是DTO的用途。
您可以创建另一个类(例如UpdateProductCommandDto
),它只包含您需要/想要用作输入的属性,然后您可以使用Automapper之类的内容来映射它到UpdateProductCommand
的新实例。