跳到主要内容
版本:3.0

跨域支持(Aegis.Core.Cors)

Aegis.Core.Cors 负责 Aegis 应用里的 CORS 策略注册与中间件接入。它支持通过 Aegis:Cors 配置节集中声明允许源、请求方法、请求头、暴露头和预检缓存,并支持运行时配置变更后的策略刷新。

组件概览

字段说明
组件名称跨域支持
真实类库Aegis.Core.Cors
组件定位CORS 策略装配与跨域中间件
引入方式安装 NuGet,并在 Component.deps.json 中启用 Cors
组件声明Cors
配置节点Aegis:Cors
核心能力动态策略提供、预检缓存、暴露框架响应头、热更新

什么时候要用它

适合场景:

  • 前后端分离应用访问 Aegis API
  • 网关或浏览器跨域访问 Web API
  • 需要按环境控制允许源、方法、请求头
  • 需要让前端读取 X-Request-IdX-Pagination 这类响应头

最小可运行路径

第一步:在组件配置里启用 Cors

这个组件既要注册服务,也要进入中间件链,所以两处都要配置。

{
"Components": {
"Services": [
"Cors"
],
"Middlewares": [
"Cors"
]
}
}

第二步:先理解默认配置

如果你没有显式配置 Aegis:Cors,当前默认行为更接近“默认放行”:

  • 允许任意源
  • 允许任意方法
  • 允许任意请求头
  • 默认允许携带凭证
  • 默认暴露 X-Pagination
  • 始终暴露 X-Request-Id

这意味着它更适合作为“框架默认可用”的起点,而不是生产环境最终口径。对外系统建议仍然明确写出允许源和允许头。

第三步:按项目配置具体 CORS 策略

{
"Aegis": {
"Cors": {
"Enabled": true,
"AllowedOrigins": [
"https://app.example.com",
"https://admin.example.com"
],
"AllowedMethods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"AllowedHeaders": [
"Authorization",
"Content-Type",
"X-Request-Id"
],
"ExposedHeaders": [
"X-Pagination"
],
"AllowCredentials": true,
"PreflightMaxAgeSeconds": 3600,
"EnablePreflightCache": true
}
}
}

第四步:注意中间件顺序

Cors 必须放在 Authentication 之前。

{
"Components": {
"Middlewares": [
"Swagger",
"Cors",
"SignalR",
"Authentication",
"Authorization"
]
}
}

这组配置分别控制什么

配置项作用
Enabled是否启用 CORS
AllowedOrigins允许的来源列表
AllowedMethods允许的 HTTP 方法
AllowedHeaders允许的请求头
ExposedHeaders允许前端读取的响应头
AllowCredentials是否允许 Cookie / Authorization 等凭证
PreflightMaxAgeSeconds预检请求缓存时间
EnablePreflightCache是否启用预检缓存优化

为什么 Cors 必须在 Authentication 之前

浏览器发送 OPTIONS 预检请求时,通常不会携带业务请求里的鉴权头。
如果认证中间件先执行,就可能直接把预检请求拦掉,结果表现为:

  • 浏览器提示跨域失败
  • 实际业务请求根本没有发出
  • 服务端看起来像“认证失败”,但前端看到的是 CORS 错误

正确顺序应该是:

  1. Cors
  2. Authentication
  3. Authorization
  4. 后续业务中间件

前端最常见会依赖哪些响应头

当前跨域组件会重点照顾两类响应头:

  • X-Request-Id
  • X-Pagination

其中 X-Request-Id 会被强制暴露,不需要你手动重复配置。
如果还有其他自定义响应头要给前端读,再补到 ExposedHeaders 里。

预检缓存有什么用

EnablePreflightCache = truePreflightMaxAgeSeconds > 0 时,浏览器会缓存预检结果,减少频繁 OPTIONS 请求。

适合场景:

  • 前端频繁调用同一组接口
  • 管理后台或工作台页面接口量较大
  • 希望减少预检带来的额外往返

接入完成后怎么确认成功

你至少应该确认这些点:

  • 浏览器访问时已经返回了 CORS 相关响应头
  • 预检请求 OPTIONS 不会被认证链错误拦截
  • X-Request-IdX-Pagination 能被前端读取
  • 允许源是否已经按环境收敛,而不是长期保持全放行

常见问题

为什么前端报跨域,但后端看起来没问题

最常见原因是 Cors 没有进入 Middlewares,或者中间件顺序放错了。
优先检查:

  1. Services 里是否包含 Cors
  2. Middlewares 里是否包含 Cors
  3. Cors 是否位于 Authentication 之前

为什么明明允许凭证了,前端还是拿不到结果

除了 AllowCredentials,还要继续确认:

  • 请求来源是否真的在 AllowedOrigins
  • 前端是否以允许凭证的方式发起请求
  • 响应头里是否正确返回了允许源,而不是漏掉了跨域头

为什么前端拿不到 X-Request-Id

默认情况下组件会暴露 X-Request-Id
如果仍然拿不到,优先检查:

  • 实际响应里有没有这个头
  • 请求是否真的经过了 Cors 中间件
  • 前端是不是在跨域场景下读取该头

下一步看哪里