Skip to main content
 首页 » 编程设计

c#之具有 .NET 核心和 json 验证的 WebApi

2024年02月25日34bhlsheji

我正在使用 .NET Core 2.0 创建一些 WebAPI。我在验证时遇到问题。

[HttpPost] 
public async Task<IActionResult> RegisterUser([FromBody] RegistrationModel model) { 
    if (model != null && ModelState.IsValid) 
    { 
        // model is valid 
    } 
} 

例如RegistrationModel的定义

public class RegistrationModel 
{ 
    [JsonRequired] 
    [JsonProperty("emailAddress")] 
    public string EmailAddress { get; set; } 
 
    [JsonRequired] 
    [JsonProperty("userCustomerId")] 
    public string UserCustomerId { get; set; } 
} 

如果我传递这个json,就有一个完美的匹配

{ 
    "emailAddress" : "test.email@gmail.com", 
    "userCustomerId" : "b1cb8805-2a59-428e-9c2a-ec663093f84f" 
} 

我的问题是,如果我传递一个带有额外字段的 json,该模型仍然有效。

{ 
    "emailAddress" : "test.email@gmail.com", 
    "userCustomerId" : "b1cb8805-2a59-428e-9c2a-ec663093f84f", 
    "extraField": "Hello!" 
} 

基本上,webapi 忽略了额外的字段,但我想发回错误,例如 Model is not valid。

我该如何实现?

请您参考如下方法:

这称为过度发布,可以在此处找到一些缓解策略:https://andrewlock.net/preventing-mass-assignment-or-over-posting-in-asp-net-core/

您可以添加自定义模型绑定(bind)器或自定义 Json 反序列化以防止过度发布,但我认为这不值得 - 确保您的模型不易受攻击并继续前进。

为什么?

  1. 对你所接受的要开明。

  2. 有时客户端会发送一些额外的东西(例如 NewtonSoft.Json 有时会发送一个 $id 属性),停用该行为可能会非常烦人。