【问题标题】:how can I validate a web api request object for this scenario?如何验证此场景的 Web api 请求对象?
【发布时间】:2018-05-03 19:31:25
【问题描述】:

我在 Web API 2.2 项目中有一个 api/v1/users/search uri。此 uri 接受 UserSearchRequest 对象。这是一个示例:

{
"DomainName":"ad.corp.domain",
"NetworkUserId":"jsmith2",
"FirstName":"John",
"LastName":"Smith"
}

后端搜索逻辑将附加所有提供的请求参数值以过滤返回的用户集。否则,一个空的请求对象将导致所有用户都被返回。但是,如果客户端通过如下请求,则将返回所有用户:

{
"UserName":"jsmith2"
}

在上面的示例中,错误地使用了无效的 UserName 属性而不是 NetworkUserId。但是,由于没有提供有效的搜索条件属性值,它只是忽略了附加属性并返回了所有用户,而不是 Web API 返回错误。

验证传入请求的正确方法是什么,以便如果提供了无效的属性名称,那么 Web API 将返回 404 BadRequest,并且最好指示无效的属性名称?

【问题讨论】:

  • 您可能会考虑要求该字段并使用* 之类的东西来表示“全部”。我看不到任何代码,但我可以推断问题不在于发送了无效属性,而是反序列化为该属性创建了一个带有null 的对象。我认为你的意思是400,而不是404
  • 不,有 10 个搜索属性,它们都不是必需的
  • 你不能同时拥有它。

标签: c# asp.net .net asp.net-web-api asp.net-web-api2


【解决方案1】:

您正面临“过度发布”问题。这可以通过几种不同的方式处理:

  1. 使用Bind 属性并将所需的属性列入白名单或黑名单。

     public ActionResult search([Bind(Exclude="UserName")] Person person)
      {
          ...
      }
    
      public ActionResult search([Bind(Include="DomainName, NetworkUserId, 
        FirstName, LastName")] Person person)
      {
         ...
      }
    
  2. 另一种解决方案是通过扩展IModelBinder 创建Custom Model Binder。这将识别额外的列并将其作为错误处理。您可以检查实现here

【讨论】:

    【解决方案2】:

    如果属性名称或数据类型不正确,web api 将无法将 json 反序列化为 UserSearchRequest 对象,并且 api 控制器参数将为空。您可以检查 null 这将表明输入请求的格式不正确。这是示例代码:

     public async Task<IActionResult> SearchUsers([FromBody] UserSearchRequest 
     searchRequest) {
       if(searchRequest == null)
        {
            return BadRequest();
        }
       //For valid search request, continue search...
    }
    

    【讨论】:

    • 但根据 OP,这是一个有效的请求,应该返回所有数据。
    • 不,我已经进行了验证检查。如果包含额外的无效属性,则 web api 将默认忽略该属性
    • @Harsh no 请求应该被视为无效,并且应该在 BadRequest 中返回一条消息,例如“UserName is not a valid UserSearchRequest property name”
    • 一个选项可能是将输入参数数据类型设置为动态以接收输入对象,然后检查输入搜索对象是否有其他无效属性
    【解决方案3】:

    我认为您正在从特定 x 或 y 表中获取数据。您在此处显示的是返回目录数据。这实际上是容易的部分。您可以管理验证的控制器代码。我认为您想获得“NetworkUserId”,但控制器您可能会更改为 username 。请检查您的数据类型。请附上您的控制器代码和模型类。谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 2014-09-14
      • 2014-09-29
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多