如何验证此方案的Web api请求对象?

时间:2018-05-03 19:31:26

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

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

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

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

{
"UserName":"jsmith2"
}

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我想你在这里从特定的x或y表中获取数据。你在这里展示的是返回目录数据。这实际上很容易。控制器代码,您可以管理验证。我认为你很想得到&#34; NetworkUserId&#34;但控制器可能会更改为用户名。请检查您的数据类型。请附上您的控制器代码和型号等级。谢谢。