Использование подстановочного знака в домене для CORS в .NET Core - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь использовать SetIsOriginAllowedToAllowWildcardSubdomains, чтобы несколько доменов могли попасть в мою конечную точку.Вот мой Configure метод:

    public void ConfigureServices(IServiceCollection services)
    {
        // Add CORS before AddMvc.
        services.AddCors(
            options => options.AddPolicy(
                "MyPolicy",
                builder =>
                    {
                        builder
                            .WithOrigins("http://*8080")
                            .SetIsOriginAllowedToAllowWildcardSubdomains()
                            .WithMethods("GET").AllowAnyHeader()
                            .AllowCredentials();
                    }));

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddJsonOptions(
            options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
        services.AddLogging();
        }

И я включаю эту политику CORS для моей конечной точки, используя атрибут [EnableCors("MyPolicy")] до определения моей конечной точки.

Однако, когда я нажимаю на этоконечная точка от http://localhost:8080, браузер отклоняет вызов с ..from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present.(Конечно, он работает нормально, если я использую метод http://localhost:8080 в WithOrigins).

Почему SetIsOriginAllowedToAllowWildcardSubdomains не использует подстановочный знак для соответствия URL?

1 Ответ

0 голосов
/ 21 сентября 2019

Отвечая на мой собственный вопрос ..

Итак, .NET Core с открытым исходным кодом и почему бы не посмотреть на исходный код :)

internal static class CorsPolicyExtensions
{
    private const string _WildcardSubdomain = "*.";

    public static bool IsOriginAnAllowedSubdomain(this CorsPolicy policy, string origin)
    {
        if (policy.Origins.Contains(origin))
        {
            return true;
        }

        if (Uri.TryCreate(origin, UriKind.Absolute, out var originUri))
        {
            return policy.Origins
                .Where(o => o.Contains($"://{_WildcardSubdomain}"))
                .Select(CreateDomainUri)
                .Any(domain => UriHelpers.IsSubdomainOf(originUri, domain));
        }

        return false;
    }

    private static Uri CreateDomainUri(string origin)
    {
        return new Uri(origin.Replace(_WildcardSubdomain, string.Empty), UriKind.Absolute);
    }
}

И мы можемсм. в коде .Where(o => o.Contains($"://{_WildcardSubdomain}")), что он не будет пытаться сопоставить источник, используя подстановочный знак, если указанное происхождение не содержит ://*..

. Как упомянуто в комментариях @Amy, мы могли бы использоватьтолько один * для представления всего доменного имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...