【问题标题】:Returning a 403 from a custom model binder从自定义模型绑定器返回 403
【发布时间】:2017-10-31 04:50:55
【问题描述】:

我们正在为我们的 .Net Core api 使用一些自定义模型绑定器,并且模型绑定器中有一些逻辑,这有时会导致我们的 api 返回 403

我知道当模型绑定失败时您可以使用Mvc.ModelBinding.ModelBindingResult.Failed() 返回400,但是如果由于尝试Unauthorized 访问而失败,那么我们需要返回@987654326 @,最好带有自定义消息。

【问题讨论】:

标签: c# .net-core api-design


【解决方案1】:

你不能只返回状态码吗?您可以在此处附加您自己的消息。

return StatusCode(403);

【讨论】:

  • 我不确定这是否有效,因为模型绑定发生在 MVC 管道期间,并且我返回一个 Task,据我所知,它不能真正采用StatusCode?
  • 当您返回 Failed 时,它看起来像这样:bindingContext.Result = ModelBindingResult.Failed(); return Task.FromResult(0);bindingContext 只能设置为 FailedSuccess 而不能设置为失败的具体原因: /
【解决方案2】:

最终我们决定使用ModelBindingResult.Failed() 和自定义错误消息,表明失败是由于授权失败。

【讨论】:

    【解决方案3】:

    可以在您的ModelBinder 实现中调用bindingContext.ModelState.AddModelError("Unauthorized", "Reason")

    然后在控制器内部,您可以使用if(ModelState.IsValid) 来断言 ModelBinder 是否正常工作以及您在此过程中是否有任何验证错误。

    在您的情况下,您可以检查它是否无效,并像往常一样在控制器中处理未经授权的响应。

    我会保留 ModelBindingResult.Failed() 用于模型绑定中非预期的灾难性错误(例如由格式错误的请求引起),而不是开发人员期望的预期行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 2011-11-13
      • 1970-01-01
      • 2012-07-31
      • 2012-02-18
      • 2012-01-29
      相关资源
      最近更新 更多