如何从服务器端启用 CORS?

How is it possible to enable CORS from server-side?

根据我在网络方面的一点经验API,同源策略是浏览器的策略,即浏览器不允许向其他主机而不是源发出请求。我想知道如何从服务器端启用 CORS(谈论 ASP.net Web API)?

这就是我在网络中启用 CORS 的方式API

namespace WebService.Controllers
{
    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public class TestController : ApiController
    {
        // Controller methods ...
    }
}

如果 CORS 是浏览器的东西,那么从客户端启用它不是更合乎逻辑吗?谁能解决这个问题

以下是对其工作原理的简短总结:浏览器是执行 same-origin 政策和 cross-origin 限制的地方。具体来说,浏览器阻止前端 JavaScript 代码访问来自 cross-origin 请求的响应——除非 请求的服务器发送响应 header Access-Control-Allow-Origin 回复。

换句话说,让浏览器放宽 same-origin 策略的方法是让服务器使用 Access-Control-Allow-Origin header 来表明他们选择加入 cross-origin 请求。

因此,浏览器是应用或放松任何 cross-origin 限制的地方。

一个有助于说明其工作原理的案例是一个简单的 cross-origin POST。只要 cross-origin POST 没有任何会触发浏览器执行 CORS preflight OPTIONS request 的自定义请求 header,浏览器就会继续发出请求,甚至 cross-origin。 POST 发送到的服务器将继续接受它,然后发送响应。

然后发生的事情是来自浏览器的 cross-origin 限制开始的地方——因为如果 POST 请求是使用 XHR 或 Fetch API 从前端 JavaScript 代码发送的] 或来自某些 JavaScript 库的 Ajax 方法,那么除非响应包含 Access-Control-Allow-Origin header,否则浏览器将不允许前端代码访问响应(即使服务器接受了 POST 并成功了。

无论如何,我希望以上内容有助于阐明在服务器中启用 CORS 支持的实际含义,它有什么影响,以及实际的策略执行是由浏览器执行的。

当然以上只是描述了最简单的情况,没有请求的特征会触发浏览器做CORS preflight OPTIONS request.

但在那种情况下,策略执行全部由浏览器执行——事实上更是如此,例如,浏览器不允许 POST 和自定义 headers 甚至被发送到服务器开始,除非服务器明确指示(在其对预检 OPTIONS 的响应中)服务器已选择接收 cross-origin 请求,其中包括该自定义 header。