【问题标题】:Unexpected behavior with CORS on .NET Core.NET Core 上的 CORS 出现意外行为
【发布时间】:2021-10-02 23:34:39
【问题描述】:

我已将以下内容添加到我的服务配置中。

services.AddCors(options 
    => options.AddDefaultPolicy(builder 
        => builder
            //.AllowAnyHeader()
            .WithHeaders("header-that-nobody-knows")
            .WithOrigins("http://localhost:44304")));

我的期望是调用会反弹(因为我没有将 header-that-nobody-knows 添加到我的标题中)。但是,执行请求时就像设置了AllowAnyHeader()

WithOrigins() 中操作端口、域或协议会产生预期的结果,因此配置似乎已正确连接。我怀疑这是一种特殊情况,因为在涉及 GETPOST 时,WithMetod() 出现意外行为(而其他方法被阻止/允许取决于参数通过)。

检查 MSDN 并没有给出任何解释。

我怀疑它是否重要,但为了完整起见,这里是调用调用的 Angular 代码。

let url = "https://localhost:44301/security/corstest?input=blobb";
this.http.get<any>(url).subscribe(
  next => console.log("next", next),
  err => console.warn("err", err));

动作方法如下所示。

[HttpGet("corstest")]
public IActionResult CorsTest([FromQuery] string input)
{
    return Ok(new { data = input + " indeed..." });
}

【问题讨论】:

    标签: c# .net-core cors .net-core-3.1


    【解决方案1】:

    当您尝试向带有“非标准”标头的跨域 URL 发送请求时, 浏览器将使用包含非标准标头的 Access-Control-Request-Headers 标头执行预检 OPTIONS 请求。

    OPTIONS /corstest
    
    Access-Control-Request-Method: GET
    Access-Control-Request-Headers: header-that-nobody-knows
    Origin: https://my.api
    

    ASP.NET Core 检查此值并检查 CORS 策略是否具有 AllowAnyHeader 或是否明确允许使用 .WithHeaders,如果没有,它将发出非 200 响应并且浏览器将拒绝发送实际请求。

    因此,不将header-that-nobody-knows 添加到请求标头并不意味着 ASP.NET Core 将拒绝为请求提供服务,这意味着如果您在跨域请求中设置 header-that-nobody-knows 标头,它将 允许它而不是发出非 200 响应(假设您使用 WithHeadersAllowAllHeaders 允许它)

    简而言之:

    • 您必须至少允许一些/所有来源 + 一些/所有标头才能使 CORS 策略生效。
    • 浏览器期望预检请求中的Access-Control-Allow-HeadersAccess-Control-Allow-Origin 与主请求相匹配。
    • 您只能发送允许的标头的子集(包括 0 个)。

    参考

    【讨论】:

    • 我有点困惑,可能是错字或语言错误,否定词太多。让我消化一下。案例 #1:我在请求中设置了 htnk 并在服务器上设置了允许标头 htnk。结果#1:请求得到处理。案例#2:我在我的请求中设置了 not htnk 但在服务器上允许它。结果#2:请求也得到了服务?我希望 only 将标头设置为服务器允许的任何内容(为简单起见,不包括 allow-all 情况)。如果无论如何都提供所有内容,那么设置 allow-this-or-that 有什么意义?!
    • 请注意,我发送的请求没有所述自定义标头,如示例所示。它只是简单、简单的 GET,没有附加任何铃铛。您是说考虑到上述设置,从允许的来源通过就足够了吗?我认为这是允许-if-origin--如果-headers 是正确的。
    • 案例1:请求被服务。案例2:也服了。如果您未在 CORS 策略中设置任何标头,则为 effectively allows all headers(如果我对代码的解释正确)。
    • 我希望只有将标头设置为服务器允许的任何内容才能工作 True。如果您只允许 asd 标头,并发送 xyz 标头,则不会处理请求。
    • 假设您允许来源x 和标题abc案例 1:请求来自源 y -> 未服务。 案例 2:来源 x,标头 a -> 已服务。 案例 3:原点 x,标头 abm -> 未提供。 案例 4:来源 x 带有标头 abc -> 已服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多