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

问题描述 投票:4回答:1

我正在尝试将我的资产投放到同一个域的一个子域中。因此,当我的主域为https://localhost:44111/时,资产网址将类似于https://assets.localhost:44111/css/style.css

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

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

当我包含资产子域中的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?

更新

当我手动更改对资产的请求时,它会起作用!在此处手动更改请求会感到错误。有什么想法吗?

app.MapWhen(context => {
    return context.Request.Host.Value.StartsWith("assets.", StringComparison.OrdinalIgnoreCase)
} (appBuilder) =>
{
    appBuilder.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider("C:/assets"),

        // This is what I mean by manually altering the request
        OnPrepareResponse = ctx =>
        {
            ctx.Context.Request.Headers["Access-Control-Allow-Origin"] = "*";
        }
    });
});
c# asp.net-core cors asp.net-core-2.0 asp.net-core-2.2
1个回答
1
投票

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

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

[note:请不要忘记cors网址不能以/]结尾>

© www.soinside.com 2019 - 2024. All rights reserved.