代码之家  ›  专栏  ›  技术社区  ›  djs Evandro Pomatti

.Net Core将CORS配置为允许同时使用所有子域和所有本地主机端口

  •  1
  • djs Evandro Pomatti  · 技术社区  · 4 年前

    *.myintra.net )也来自所有人 localhost 端口(用于在IIS Express中本地调试各种应用程序时,即。 http://localhost:12345 , http://localhost:54321 等等)。

    This answer 演示如何使用 SetIsOriginAllowedToAllowWildcardSubdomains() 允许所有子域。

    This answer 本地服务器 通过使用 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 我内心的逻辑 功能。

    本地服务器

    0 回复  |  直到 4 年前
        1
  •  2
  •   Kay Meister    4 年前

    我就是这样实现的:

    我正在用 等原始 :

        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网站还有一个-example.com网站包括所有子域。 如果服务正在运行的ASPNETCORE_环境包含“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;
    }
    
    推荐文章