【问题标题】:Web API CORS implementationWeb API CORS 实现
【发布时间】:2018-05-25 10:42:22
【问题描述】:

首先让我说我了解 CORS 的概念以及它的工作原理,但我有一个非常具体的问题,即它是如何在 Microsoft 的 Web API 中实现的。我在 Global.ascx.cs 文件中配置了 CORS,如下所示:

var cors = new EnableCorsAttribute("https://example.com", "*", "*");
config.EnableCors(cors);

现在,当我在 Web api 中请求带有标头 Origin: https://example.com 的资源时,我收到一个包含标头 Access-Control-Allow-Origin: https://example.com 的响应,这是预期的。但是,当我请求具有不同 Origin 值或完全没有该标头的相同资源时,来自服务器的响应没有 Access-Control-Allow-Origin 标头。

这是想要的结果吗?或者服务器是否应该始终使用 Access-Control-Allow-Origin 标头进行响应?

我问是因为我们已经让 Veracode 扫描了我们的代码库,他们说响应应该始终包含标题 Access-Control-Allow-Origin: https://example.com。据我了解,浏览器仍然会抛出No 'Access-Control-Allow-Origin' header is present on the requested resource,无论标头是否存在不同的来源或标头根本不存在(我认为不披露允许的域将是首选解决方案)。

另外,我知道我可以通过将其添加到我的 web.config 来使标题始终显示:

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="https://example.com" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

但我真的只是想知道正确的实现是什么。

【问题讨论】:

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


    【解决方案1】:

    行为是设计使然:

    如果响应不包含 Access-Control-Allow-Origin 标头,则 AJAX 请求将失败。具体来说,浏览器不允许该请求。即使服务器返回一个成功的响应,浏览器也不会将响应提供给客户端应用程序。

    链接的文章在CORS 的工作原理部分包含完整说明。

    它还提供了浏览器发送预检请求时的信息以及如何在预检请求中启用标头 Access-Control-Request-Method 和 Access-Control-Request-Header

    Enabling CORS in Web API 2

    规范还告诉响应可能包含具有适当值的此标头以允许访问资源,但如果资源不应该可供客户端使用,则不必包含它

    对 CORS 请求的 HTTP 响应可以包含以下标头:

    Access-Control-Allow-Origin

    通过在响应中返回Origin 请求标头(可以是null)或* 的文字值来指示是否可以共享响应。

    Fetch standard

    编辑

    W3 Recomendation 更明确地说,不允许从其他来源访问的资源不应包含 Access-Control-Allow-Origin 标头

    对其他来源的应用程序无用的资源(例如登录页面)不应返回 Access-Control-Allow-Origin 标头。资源仍然必须保护自己免受 CSRF 攻击,例如要求在请求的明确提供的内容中包含不可猜测的令牌。此类资源的安全属性不受符合本规范的用户代理的影响。

    【讨论】:

    • 这是我的想法,但找不到任何文档。那么既然我们的 web api 是遵循标准的,为什么 Veracode 会要求我们改变它呢?
    • 不确定,我会请他们解释原因。我同意您的观点,即披露有效来源具有潜在危险
    • 是的,这就是我们必须做的,我只是想要一些信息来支持我的想法。谢谢!
    猜你喜欢
    • 2015-02-03
    • 2021-09-02
    • 2015-01-06
    • 2015-04-16
    • 2014-06-16
    • 2016-10-07
    • 2018-10-17
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多