【问题标题】:How to accept a bodyless GET request with JSON as it's content type?如何接受以 JSON 为内容类型的无正文 GET 请求?
【发布时间】:2019-11-04 23:55:21
【问题描述】:

迁移到 ASP.NET Core 2.1 后,我们意识到我们 API 的一些使用者正在发送带有 Content-Type 标头设置为 application/json 的 GET 请求。可悲的是,这些请求过去并没有被拒绝(即使它们应该被拒绝),但这仍然是一个突破性的变化..

由于我们的消费者需要自己解决这个问题,而且这需要一些时间,我们希望暂时接受这些请求,这样我们就不会等待。

框架(正确)拒绝请求并显示以下错误消息:"A non-empty request body is required."

动作如下所示:

[Route("api/file/{id:guid}")]
public async Task<IActionResult> Get(Guid id)
{
     // Some simple code here
}

由于错误在到达操作之前已被抛出(由于请求不正确),因此未到达操作内的代码。

@Nkosi 的解决方案得到了相同的响应:

[HttpGet("api/file/{id:guid}")]
public async Task<IActionResult> Get([FromRoute]Guid id)
{
     // Some simple code here
}

消费者使用的 (PHP) cURL 是这样的:

$ch = curl_init(self::API_URL."/file/".$id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "Application: APPKey ".$this->AppKey,
    "Authorization: APIKey ".$this->ApiKey
));

删除"Content-Type: application/json", 行会将请求变为有效请求,因此我们有 99.9% 的把握确定添加此标头是作恶者。

【问题讨论】:

  • @Timmeh 使用HttpGet 属性并尝试使用FromRoute 来告诉操作从哪里绑定ID。
  • 我无法使用提供的信息复制此内容。您可能需要minimal reproducible example
  • @KirkLarkin 你是如何测试这个的?我不能用 Postman/Insomnia 重现这个,但我可以用消费者的 PHP cURL(添加到帖子中)
  • @Timmeh 您是否考虑过添加一个中间件来检查请求并删除获取请求的标头
  • @JConstantine 导致其他问题并关闭整个 API 的验证,我更喜欢删除过滤器/中间件中的标头。

标签: c# asp.net-core asp.net-core-2.1


【解决方案1】:

考虑在管道的早期删除中间件中的标头。

public void Configure(IApplicationBuilder app) {
    app.Use(async (context, next) => {
        var request = context.Request;
        var method = request.Method;
        IHeaderDictionary headers = request.Headers;
        string key = "Content-Type";
        if (method == "GET" && request.Headers.ContainsKey(key)) {
            headers.Remove(key);
        }

        // Call the next delegate/middleware in the pipeline
        await next();
    });

    //...
}

【讨论】:

  • 目前稍后(在过滤器中)执行此操作,因此已执行身份验证,但仍接受此操作,因为它的工作原理相同。
  • 特别是因为这只是一个临时修复,直到客户修复他们的一面。
  • 这可能是“Soon™”
猜你喜欢
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 2012-04-23
相关资源
最近更新 更多