.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;
}
Другие вопросы по тегам