Middleware (6) — CORS

1 Introduction

CORS 是 Cross-Origin Resource Sharing 的缩写,它可以用来指定某个服务的资源可以被哪些请求的 Origin 使用,违反这个策略请求的响应会被浏览器拒绝掉。

OPTIONS /doc HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
Origin: https://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
HTTP/1.1 204 No Content
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2
Access-Control-Allow-Origin: https://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
Vary: Accept-Encoding, Origin
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
  • Access-Control-Allow-Methods: POST, GET, OPTIONS 允许 POST , GETOPTIONS 三个方法访问。
  • Access-Control-Allow-Headers 确保 X-PINGOTHERSContent-Type 两个 Header 都可以访问。
  • Access-Control-Max-Age 则是说明多久这个 preflight 请求可以被缓存起来。
  • Access-Control-Allow-Headers 不能设置为 *
  • Access-Control-Allow-Methods 不能设置为 *

2 CorsPolicy

CorsPolicy 定义了我们在上面的讨论的所有的策略,包含了下面这些字段

3 CorsOptions

对于服务端而言,不同的资源可能有不同的 Policy ,因此 CorsOptions 定了不同的 Policy 以供后续选择。

4 CorsService

CorsService 主要做两件事

  • 根据之前获取的 CorsResult ,在 HttpResponse 中写入相关的信息
  • policy 包含了 origin
  1. 如果请求命中的 EndPointIDisableCorsAttribute ,也就是意味着不进行 Cors 操作,那么对于 preflight 就直接返回,对于其他的请求则由 next 处理
  2. 对于 ICorsPolicyMetadataIEnableCorsAttributeEndpoint ,则获取 PolicyName 或者 CorsPolicy 对象
  3. 在获取 CorsPolicy 之后,则调用 CorsServiceHttpRequest 进行计算,如果是 preflight ,则立马 对 Response 进行修改,然后返回;对于其他的请求,注册一个操作的委托,然后注册到 ResponseOnStarting 方法中。

6 实例

A software developer in Microsoft at Suzhou. Most articles spoken language is Chinese. I will try with English when I’m ready

A software developer in Microsoft at Suzhou. Most articles spoken language is Chinese. I will try with English when I’m ready