c# - .Net Core 配置 CORS 以同时允许所有子域和所有 localhost 端口
问题描述
我想允许来自*.myintra.net
所有localhost
内部网站http://localhost:12345
(http://localhost:54321
这个答案向我展示了如何使用SetIsOriginAllowedToAllowWildcardSubdomains()
来允许所有子域。
这个答案localhost
向我展示了如何使用SetIsOriginAllowed()
委托函数来允许任何端口。
但是,这些选项似乎不能一起使用。我的配置:
private bool AllowLocalhost(string origin)
{
var uri = new Uri(origin);
return (uri.Host == "localhost");
}
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
string[] corsList = "https://*.myintra.net,https://some.specificurl.com".Split(",");
options.AddPolicy("CorsPolicy", builder =>
{
builder
.WithOrigins(corsList.ToArray())
.SetIsOriginAllowedToAllowWildcardSubdomains()
.SetIsOriginAllowed(origin => AllowLocalhost(origin)) // disallows calls from myapp.myintra.net since it doesn't uri.Host match "localhost"
...();
});
});
...
}
我可以交换配置的顺序:
.SetIsOriginAllowed(origin => AllowLocalhost(origin))
.SetIsOriginAllowedToAllowWildcardSubdomains()
但是这个AllowLocalhost()
函数永远不会被调用。我认为一次只有一个工作是有道理的,因为第一个检查可能会返回true
,而第二个检查可能会返回false
。
理想情况下,我想要一个不需要重新实现函数allow wildcard
内部逻辑的解决方案。AllowLocalhost()
另外值得注意的是,我真的只需要在开发环境中使用它。生产需要允许通配符,但localhost
无论端口如何都不允许。
解决方案
这就是我实现它的方式:
我正在使用IsOriginAllowed检查原点:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddCors(options =>
{
options.AddPolicy(name: "AllowedCorsOrigins",
builder =>
{
builder
.SetIsOriginAllowed(IsOriginAllowed)
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
// ...
像往常一样激活 Cors:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
// ...
app.UseCors("AllowedCorsOrigins");
// ...
这就是方法,应该可以解决问题。接受来自 example.com 和 another-example.com 的所有请求,包括所有子域。如果服务正在运行的 ASPNETCORE_ENVIRONMENT 包含“DEV”,则也允许本地主机。
private static bool IsOriginAllowed(string origin)
{
var uri = new Uri(origin);
var env = System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "n/a";
var isAllowed = uri.Host.Equals("example.com", StringComparison.OrdinalIgnoreCase)
|| uri.Host.Equals("another-example.com", StringComparison.OrdinalIgnoreCase)
|| uri.Host.EndsWith(".example.com", StringComparison.OrdinalIgnoreCase)
|| uri.Host.EndsWith(".another-example.com", StringComparison.OrdinalIgnoreCase);
if (!isAllowed && env.Contains("DEV", StringComparison.OrdinalIgnoreCase))
isAllowed = uri.Host.Equals("localhost", StringComparison.OrdinalIgnoreCase);
return isAllowed;
}