概述
在微服务架构中,前端应用与网关往往部署在不同域名下,需要配置**跨域资源共享(CORS)**才能正常访问。silky 框架通过 Silky.Http.CorsAccessor 模块对 CORS 进行统一管理,只需配置 YAML 文件即可完成跨域设置,无需手动编写中间件代码。
说明
CORS 配置仅对网关(Silky.Agent.Host)和Web 主机类型有效,通用主机(General Host)不提供 HTTP 服务,不需要配置 CORS。
启用 CORS
Silky.Http.CorsAccessor 模块已内置在 Silky.Agent.Host 中,默认自动启用,无需额外安装包或手动注册中间件。
如果是自定义主机,需要在 Startup.cs 中手动注册:
public void ConfigureServices(IServiceCollection services)
{
services.AddSilkyHttpCore()
.AddCorsAccessor(); // 注册跨域服务
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCorsAccessor(); // 启用跨域中间件(必须在 UseRouting 之前)
app.UseRouting();
// ...
}
配置项说明
跨域配置通过 CorsAccessor 配置节点进行设置,对应类型为 CorsAccessorOptions:
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
policyName | string | App.CorsAccessor.Policy | 跨域策略名称 |
withOrigins | string[] | [](允许所有来源) | 允许的来源域名列表,空数组表示允许所有来源 |
withHeaders | string[] | null(允许所有请求头) | 允许的请求头列表 |
withExposedHeaders | string[] | null | 响应时暴露给前端的响应头 |
withMethods | string[] | null(允许所有请求方法) | 允许的 HTTP 请求方法列表 |
allowCredentials | bool | true | 是否允许跨域请求携带凭据(Cookie 等) |
setPreflightMaxAge | int? | null | 预检请求(OPTIONS)结果的缓存时间(秒) |
配置示例
允许所有来源(开发环境)
允许任意来源访问,适用于开发和测试阶段:
CorsAccessor:
# withOrigins 为空时,允许所有来源,但无法同时设置 allowCredentials: true
allowCredentials: false
注意
当 withOrigins 为空(允许所有来源)时,allowCredentials 必须设置为 false。这是浏览器安全规范的限制:Access-Control-Allow-Origin: * 不能与 Access-Control-Allow-Credentials: true 同时使用。
指定来源(生产环境推荐)
CorsAccessor:
withOrigins:
- https://www.example.com
- https://admin.example.com
allowCredentials: true
setPreflightMaxAge: 600 # 预检结果缓存 600 秒
精细化配置
CorsAccessor:
withOrigins:
- https://app.example.com
withHeaders:
- Content-Type
- Authorization
- X-Requested-With
withExposedHeaders:
- X-Pagination
- X-Total-Count
withMethods:
- GET
- POST
- PUT
- PATCH
- DELETE
allowCredentials: true
setPreflightMaxAge: 3600
允许所有子域名
withOrigins 支持通配符子域名(使用 * 匹配):
CorsAccessor:
withOrigins:
- https://*.example.com # 允许所有 example.com 子域名
allowCredentials: true
配置节点位置
CORS 配置节点名称为 CorsAccessor(区分大小写),可放置在 appsettings.yaml 或独立配置文件中:
# appsettings.yaml(网关应用)
rpc:
token: ypjdYOzNd4FwENJiEARMLWwK0v7QUHPW
registryCenter:
type: Consul
connectionStrings: http://127.0.0.1:8500
CorsAccessor:
withOrigins:
- https://app.example.com
allowCredentials: true
高级用法:自定义策略
如果需要完全自定义 CORS 策略,可以在 AddCorsAccessor() 调用时传入委托:
services.AddCorsAccessor(
corsOptionsHandler: options =>
{
// 添加额外的命名策略
options.AddPolicy("StrictPolicy", builder =>
{
builder.WithOrigins("https://trusted.example.com")
.AllowAnyMethod()
.AllowAnyHeader();
});
},
corsPolicyBuilderHandler: builder =>
{
// 在默认策略基础上追加自定义设置
builder.SetIsOriginAllowed(origin => true);
}
);
