无论构建器的 WithMethods(..) 中的规范如何,似乎都允许 GET 和 POST

Posted

技术标签:

【中文标题】无论构建器的 WithMethods(..) 中的规范如何,似乎都允许 GET 和 POST【英文标题】:GET and POST appear to be allowed regardless specification in the builder's WithMethods(..) 【发布时间】:2020-04-13 18:30:50 【问题描述】:

在我的 StartUp.cs 中,我有以下 CORS 设置。

services.AddCors(_ => _.AddPolicy("LocalDev", __ => __
  .AllowAnyOrigin()
  .AllowAnyHeader()
  .WithMethods("GET", "POST", "PUT", "DELETE")
));

它按预期工作。但是,我注意到删除 GETPOST 似乎不会影响功能。但是,删除 PUTDELETE 会产生效果。我对此感到困惑。

是不是获取方式和发布方式具有特殊地位,而其他方式需要明确提供?我在MSDN for the method 中没有找到任何相关参考。

【问题讨论】:

【参考方案1】:

.WithMethods 仅在 GET/POST 请求触发 CORS 预检 OPTIONS 请求时才影响它们 - 基本上,任何包含自定义请求标头的 GETPOST。如果 GETPOST 包含任何自定义请求标头,则它不会触发 CORS 预检 OPTIONS 请求,因此无论 @ 是什么都将被允许987654331@设置是。

在 CORS 协议术语中,.WithMethods 设置 Access-Control-Request-Headers 标头值,浏览器仅在响应 CORS 预检 OPTIONS 请求时参考该值。

对于触发 CORS 预检的请求,需要条件的交集;即,请求必须具有正确的来源和正确的方法。但是对于触发 CORS 预检 OPTIONS 请求的请求,根据定义,没有“正确”的方法——因为在这种情况下,任何 Access-Control-Allow-Method 标头都是不相关的并被忽略。或者更确切地说,从概念上讲,更清楚地说,有一个“正确”方法的硬编码列表:CORS-safelisted methods — GETHEADPOST 的集合 — 在 Fetch 规范中定义.

【讨论】:

【参考方案2】:

我会测试几个对 API 的请求并检查 Access-Control-Allow-Methods 标头。这是允许/限制任何 HTTP 方法访问您的 API 的实际逻辑。

如果标头确实包含 GET,即使您没有在允许的 HTTP 动词列表中指定它,我们正在查看 .NET Core 错误,我认为您应该将其记录在https://github.com/dotnet/core/issues

【讨论】:

考虑到 GETPOST 方法的基础性,我非常怀疑我发现了一个错误,呵呵。您能否在系统上重现该行为? 详细说明我的发现。当我执行 DELETE 时,我会在网络选项卡中看到预检的 OPTIONS 和三个 allow 标头,其中一个用于方法状态的标头 PUTDELETE 应该是(没有 GET)。但是当我运行 GET 请求时,我仍然可以获取数据,但响应标头中没有关于允许的方法的任何内容。这让我很困惑...... 这看起来很奇怪.. 您发送 GET 请求的方式是否与发送 PUTDELETE 的方式相同i> 一个? 同样的方式——来自 Swagger。当然,它们之所以不同,是因为方法不同。但除此之外,没有。我从同一个位置等执行它们。【参考方案3】:

.WithMethods 仅在触发 CORS 预检 OPTIONS 请求时影响 GET/POST 请求——基本上,任何包含自定义请求标头的 GET 或 POST。

这是不正确的,即使使用自定义标头,POST+Preflight 请求也可以使用 .WithMethods("GET")

【讨论】:

以上是关于无论构建器的 WithMethods(..) 中的规范如何,似乎都允许 GET 和 POST的主要内容,如果未能解决你的问题,请参考以下文章

带有 PageView 构建器的 Flutter 中的 Tinder swiper

我的 ListView 构建器的 ListTile 小部件不可滚动并且显示渲染问题

使用 laravel 构建器的 JSON 列查询

Angular2:禁用表单构建器的元素

带有 AWS SDK V2 构建器的 MapStruct

使用界面构建器的灵活布局