2017-08-08 1 views
1

J'ai un contrôleur qui accepte un UpdateProductCommand modèle comme celui-ci:Supprimer le champ JSON dans la méthode ASP MVC WebAPI action

public IHttpActionResult UpdateProduct(UpdateProductCommand command) 
{ 
    command.AuditUserName = this.RequestContext.Principal.Identity.Name; 
    // .... 
} 

Pour les questions de sécurité, le champ AuditUserName ne doit jamais être à l'extérieur (de l'appel API).

Comment puis-je supprimer (ou tronquer) la valeur de ce champ de la requête JSON?

Répondre

0

Il peut être atteint par un ModelBinder suivant:

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; 
    } 
} 

utiliser comme ceci:

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

Cela ne le supprime pas de la demande (il ne suffit pas de le lier). Et puisque votre code dans la méthode le définit de toute façon, quel est le point? –

+0

@StephenMuecke - Je n'envoie pas ce champ dans json, mais l'API sera exposée sur Internet. Alors quelqu'un pourrait vouloir jouer et faire casser avec des requêtes brutes. –

+0

Voilà pourquoi nous utilisons des modèles de vue contenant uniquement les propriétés que nous voulons être liés à la demande :) –

0

C'est ce que DTO sont pour.

Vous pouvez juste créer une autre classe (UpdateProductCommandDto par exemple) qui ne compte que les propriétés dont vous avez besoin/voulez utiliser comme entrée, et vous pouvez simplement utiliser quelque chose comme Automapper pour la carte à une nouvelle instance de UpdateProductCommand.