跨域支持(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-Id、X-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 错误
正确顺序应该是:
CorsAuthenticationAuthorization- 后续业务中间件
前端最常见会依赖哪些响应头
当前跨域组件会重点照顾两类响应头:
X-Request-IdX-Pagination
其中 X-Request-Id 会被强制暴露,不需要你手动重复配置。
如果还有其他自定义响应头要给前端读,再补到 ExposedHeaders 里。
预检缓存有什么用
当 EnablePreflightCache = true 且 PreflightMaxAgeSeconds > 0 时,浏览器会缓存预检结果,减少频繁 OPTIONS 请求。
适合场景:
- 前端频繁调用同一组接口
- 管理后台或工作台页面接口量较大
- 希望减少预检带来的额外往返
接入完成后怎么确认成功
你至少应该确认这些点:
- 浏览器访问时已经返回了 CORS 相关响应头
- 预检请求
OPTIONS不会被认证链错误拦截 X-Request-Id和X-Pagination能被前端读取- 允许源是否已经按环境收敛,而不是长期保持全放行
常见问题
为什么前端报跨域,但后端看起来没问题
最常见原因是 Cors 没有进入 Middlewares,或者中间件顺序放错了。
优先检查:
Services里是否包含CorsMiddlewares里是否包含CorsCors是否位于Authentication之前
为什么明明允许凭证了,前端还是拿不到结果
除了 AllowCredentials,还要继续确认:
- 请求来源是否真的在
AllowedOrigins里 - 前端是否以允许凭证的方式发起请求
- 响应头里是否正确返回了允许源,而不是漏掉了跨域头
为什么前端拿不到 X-Request-Id
默认情况下组件会暴露 X-Request-Id。
如果仍然拿不到,优先检查:
- 实际响应里有没有这个头
- 请求是否真的经过了
Cors中间件 - 前端是不是在跨域场景下读取该头