c# - .Net Core 配置 CORS 以同时允许所有子域和所有 localhost 端口

标签 c# asp.net-core cors asp.net-core-3.1

我想允许来自所有内部网站( *.myintra.net )以及所有 localhost 的公共(public)内部 API 的 CORS 请求端口(当我们在 IIS Express 中本地调试各种应用程序时,即 http://localhost:12345http://localhost:54321 等)。
This answer告诉我如何使用 SetIsOriginAllowedToAllowWildcardSubdomains()允许所有子域。
This answer告诉我如何允许任何 localhost端口使用 SetIsOriginAllowed()委托(delegate)功能。
但是,这些选项似乎不能一起使用。我的配置:

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;
}

关于c# - .Net Core 配置 CORS 以同时允许所有子域和所有 localhost 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60608915/

相关文章:

c# - 具有 "Refresh"条目的组合框

c# - 为什么循环不起作用?为什么在局部变量 "y"总是 int 而 s counter = 1 = int

c# - 使用 Entity Framework 在数据库之间复制实体

c# - 记住窗口位置、大小和状态 [在 Win + 箭头对齐时](使用多个显示器)

cors - grunt-connect-proxy 配置不代理

.Net Core 2 Sql Server 连接

c# - Azure CosmosDB Contains 方法不起作用

asp.net-mvc - 项目的默认 XML 命名空间必须是 MSBuild XML 命名空间

http-headers - 忽略 CORS 设置,未写入 Access-Control-Allow-* header

amazon-s3 - 从 S3 上的静态站点进行 POST 时,AWS API Gateway 端点出现 CORS 错误