如何为 ASP.NET Core 2.2 项目中的子域正确启用 CORS?

Posted

技术标签:

【中文标题】如何为 ASP.NET Core 2.2 项目中的子域正确启用 CORS?【英文标题】:How to correctly enable CORS for a subdomain in an ASP.NET Core 2.2 project? 【发布时间】:2020-03-03 04:54:56 【问题描述】:

我正在尝试在同一域的子域上提供我的资产。因此,当我的主域是 https://localhost:44111/ 时,资产 URL 将类似于 https://assets.localhost:44111/css/style.css

style.css 文件请求包含自定义字体 my_custom_font.eot,就像这样

@font-face 
    ....
    src: url('/css/fonts/my_custom_font.eot?123');

当我包含位于 assets 子域中的 style.css 文件时,我收到以下错误

跨域请求被阻止:同源策略不允许读取位于https://assets.localhost:44111/css/fonts/my_custom_font.eot?123 的远程资源。 (原因:缺少 CORS 标头“Access-Control-Allow-Origin”)。

为了确保我清楚,style.cssmy_custom_font.eot 都位于同一域 assets.localhost:44111。包含style.css 的请求没有问题。但是,当style.css 请求包含my_custom_font.eot 时,该请求被禁止。

我尝试关注documentation 来启用 CORS。我将以下代码添加到Startup.ConfigureServices(IServiceCollection services) 方法中

services.AddCors(options =>

    options.AddPolicy("AllowSubDomainTraffic",
    builder =>
    
        builder.WithOrigins("https://assets.localhost:44111")
               .AllowAnyHeader()
               .AllowAnyMethod();
    );
);

然后在Startup.Configure(IApplicationBuilder app, IHostingEnvironment env) 方法中我添加了以下内容

app.UseCors("AllowSubDomainTraffic");

但是,我仍然在浏览器的控制台中收到 CORS header ‘Access-Control-Allow-Origin’ missing 错误。

这就是我在我的应用程序中响应子域的方式

app.MapWhen(context => 
    return context.Request.Host.Value.StartsWith("assets.", StringComparison.OrdinalIgnoreCase)
 (appBuilder) =>

    appBuilder.UseStaticFiles(new StaticFileOptions
    
        FileProvider = new PhysicalFileProvider("C:/assets"),
    );
);

如何正确启用子域的 CORS?

【问题讨论】:

这有帮助吗:***.com/questions/36877652/… @chakeda 我在方法链中添加了.SetIsOriginAllowedToAllowWildcardSubdomains(),然后在最后调用了Build(),这仍然不是同一个问题。文档不建议最后调用Build()。还有其他想法吗? 【参考方案1】:

WithOrigins(string[]) 接受一个字符串参数(字符串数组,string[])。这使您可以:

builder.WithOrigins("https://localhost:44111", "https://assets.localhost:44111")
  .AllowAnyHeader()
  .AllowAnyMethod();

注意:不要忘记cors url不能以/结尾

【讨论】:

以上是关于如何为 ASP.NET Core 2.2 项目中的子域正确启用 CORS?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 ASP.NET Core 注册和使用 MediatR 管道处理程序?

如何为 ASP.NET Core 应用配置 Azure 应用服务日志记录提供程序?

如何为asp.net中的每个项目添加复选框列表的工具提示

如何将位于应用程序部分 (DLL) 中的部分视图呈现到主 asp.net core 2.2 项目中

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

获取 ASP.NET-Core 2.2 控制器中的控制器名称和方法名称