【发布时间】:2020-11-24 22:14:55
【问题描述】:
我有一个公共分析网络 API (.Net Core 3.1),它从我的各种网络应用程序和网站(页面视图等)中捕获基本分析。我非常想以更严格的方式配置 cors,因为我很清楚流量应该来自哪里。值得注意的是,我正在将此应用程序从 .Net Core 2.2 更新为 .Net Core 3.1。
我的Startup.cs 文件中有以下方法
public void ConfigureServices(IServiceCollection services)
{
...
ConfigureCors(services);
}
private void ConfigureCors(IServiceCollection services)
{
// https://weblog.west-wind.com/posts/2016/Sep/26/ASPNET-Core-and-CORS-Gotchas
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.WithOrigins(AppConfiguration.CorsOrigins)
.AllowAnyMethod()
.AllowAnyHeader());
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseCors("CorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers().RequireAuthorization();
});
}
AppConfiguration 是我用来处理配置的一个类,它使用以下方法获取 json 值:public string[] CorsOrigins => _config["CorsOrigins"].Split(',');
在appsettings.Development.json,我有"CorsOrigins": "*"
我非常想在 appsettings.Production.json 和 appsettings.Staging.json 文件中指定严格的来源。
例如。
"CorsOrigins": "https://subdomain.example.com,https://www.example.com,https://example.com",但在部署时,每当网站/应用程序访问各个端点时,我都会获得502 的状态。
"CorsOrigins": "*" 在本地工作,所以据我所知,Startup.cs 文件不会有任何问题。
更新: "CorsOrigins": "*" 实际上也不适用于暂存或生产环境。现在我更加困惑了。需要明确的是,这是一个cors 问题。在升级到 .Net Core 3.1 之前,以下工作正常:
private void ConfigureCors(IServiceCollection services)
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
}
【问题讨论】:
-
您是否正在为“消耗”您的 appsettings.ENVIRONMENT.json(请参阅 docs.microsoft.com/en-us/aspnet/core/fundamentals/…)而苦苦挣扎,或者......您的 appsettings.ENVIRONMENT.json 文件中的值(针对您的特定 CORS)正在搞砸你呢?
-
@granadaCoder 应用程序设置的消耗是黄金,它与“*”或上面提供的示例形式的源数组不匹配。 IE。如果我调试,AppConfiguration.CorsOrigins 的预期值取决于环境。
-
根据文档,如果存在 Access-Control-Allow-Credentials 标头,则将源设置为“*”(所有源)的 CORS 规范无效。 docs.microsoft.com/en-us/aspnet/core/security/…
-
@pbachman 正确。在迁移到 .Net Core 3.1 时,AllowCredentials 已被删除,因为它在使用“*”时无效(有关之前的代码,请参阅“更新”)。在我的情况下,由于选项是“*”、“example.com”等,AllowCredentials 也不能使用并且已被删除(请参阅“更新”部分上方的当前情况。没有 Access-Control-Allow-Credentials 标题出现在我的请求中。
标签: c# asp.net-core .net-core