.NET 5 Web API子域名CORS配置失败,求有效解决方案
.NET 5 Web API 子域名CORS配置解决方案(支持AllowCredentials)
问题根源分析
你的配置失效主要有两个核心原因:
- 源URL格式错误:配置中
WithOrigins的URL带有末尾斜杠(如https://dev-XX.myapp.nl/),但浏览器发送的Origin请求头不会包含末尾斜杠,导致匹配失败。 - 通配符匹配限制:
SetIsOriginAllowedToAllowWildcardSubdomains对通配符的格式要求严格,且和具体域名混用可能引发匹配逻辑冲突,不如自定义验证逻辑可靠。
正确配置代码
1. 配置CORS服务(ConfigureServices)
替换原ConfigureCrossOrigin方法为以下实现,通过自定义逻辑验证子域名,同时保留AllowCredentials:
private void ConfigureCrossOrigin(IServiceCollection services) { services.AddCors(options => options.AddDefaultPolicy(builder => builder .AllowCredentials() .AllowAnyMethod() .AllowAnyHeader() .SetIsOriginAllowed(origin => { if (string.IsNullOrEmpty(origin)) return false; Uri originUri; if (!Uri.TryCreate(origin, UriKind.Absolute, out originUri)) return false; // 允许所有myapp.nl的子域名及主域名 return originUri.Host.EndsWith(".myapp.nl") || originUri.Host.Equals("myapp.nl", StringComparison.OrdinalIgnoreCase); }))); }
2. 调整中间件顺序(ConfigureApplication)
确保UseCors的调用顺序正确:必须在UseRouting之后、UseAuthorization之前,否则CORS中间件无法正确拦截请求:
protected override void ConfigureApplication(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime appLifetime) { base.ConfigureApplication(app, env, appLifetime); app.UseRouting(); app.UseCors(); // 关键:放在UseRouting之后,UseAuthorization之前 app.UseAuthorization(); // 其他中间件逻辑... }
关键注意事项
- AllowCredentials限制:当启用
AllowCredentials时,不能使用AllowAnyOrigin(),必须通过SetIsOriginAllowed明确指定允许的源,否则浏览器会因安全策略拒绝请求。 - 域名验证严谨性:自定义验证逻辑中加入
Uri.TryCreate可以避免非法Origin值导致的异常,同时通过StringComparison.OrdinalIgnoreCase确保大小写不敏感匹配。 - 避免末尾斜杠:所有配置的源URL都不要带末尾斜杠,保证和浏览器发送的
Origin头格式一致。
内容的提问来源于stack exchange,提问作者Dardar
相关产品推荐
相关产品推荐

