.Net Core Настройте CORS, чтобы разрешить все поддомены и все порты localhost одновременно
Я хотел бы разрешить запросы CORS к общему внутреннему API со всех внутренних веб-сайтов (*.myintra.net
), а также от всех localhost
порты (когда мы отлаживаем различные приложения локально в IIS Express, т.е. 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
.
В идеале мне нужно решение, которое не требует повторной реализации allowwildcard
логика внутри моего AllowLocalhost()
функция.
Также стоит отметить, что мне это действительно нужно только в среде разработки. В производстве необходимо разрешить подстановочные знаки, но запретитьlocalhost
независимо от порта.
0 ответов
Вот как я это реализовал:
Я проверяю происхождение с помощью 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", чем также разрешено localhost.
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;
}