ASP .NET Core: заголовки CORS только для определенных типов статических файлов

У меня есть собственный проект ASP .NET Core. Я подаю контент из статической папки (без проблем). Он без проблем обслуживает изображения между сайтами (появляется заголовок CORS). Однако для некоторых типов файлов, таких как JSON, заголовки CORS не отображаются, и клиентский сайт не может видеть содержимое. Если я переименую файл в неизвестный тип (например, JSONX), он будет обработан с заголовками CORS, без проблем. Как я могу заставить эту штуку обслуживать все с заголовком CORS?

В моем Startup.cs настроена следующая политика CORS:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials() );
        });

        // Add framework services.
        services.AddMvc();
    }

И следующее - моя конфигурация

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseCors("CorsPolicy");
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        // Static File options, normally would be in-line, but the SFO's file provider is not available at instantiation time
        var sfo = new StaticFileOptions() { ServeUnknownFileTypes = true, DefaultContentType = "application/octet-stream", RequestPath = "/assets"};
        sfo.FileProvider = new PhysicalFileProvider(Program.minervaConfig["ContentPath"]);
        app.UseStaticFiles(sfo);

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

person Blake    schedule 03.11.2016    source источник
comment
Что, если вы позвоните app.UseCors("CorsPolicy") после вызова app.UseStaticFiles(sfo)?   -  person haim770    schedule 03.11.2016
comment
Я только что проверил это: если CORS идет после, ни один из статических файлов не получает заголовок CORS.   -  person Blake    schedule 03.11.2016
comment
Пожалуйста, смотрите мой ответ... статические файлы могут быть защищены с помощью той же политики CORS stackoverflow.com/a/55538788/3568316   -  person Dure Sameen    schedule 05.04.2019


Ответы (1)


Промежуточное ПО может помочь с такой сложной логикой. Недавно я заставил это работать для источников JavaScript. Похоже, что медиа-тип для JSON — «application/json».

/*
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;

Made available under the Apache 2.0 license.
https://www.apache.org/licenses/LICENSE-2.0
*/

/// <summary>
/// Sets response headers for static files having certain media types.
/// In Startup.Configure, enable before UseStaticFiles with 
/// app.UseMiddleware<CorsResponseHeaderMiddleware>();
/// </summary>
public class CorsResponseHeaderMiddleware
{
    private readonly RequestDelegate _next;

    // Must NOT have trailing slash
    private readonly string AllowedOrigin = "http://server:port";


    private bool IsCorsOkContentType(string fieldValue)
    {
        var fieldValueLower = fieldValue.ToLower();

        // Add other media types here.
        return (fieldValueLower.StartsWith("application/javascript"));
    }


    public CorsResponseHeaderMiddleware(RequestDelegate next) {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        context.Response.OnStarting(ignored =>
        {
            if (context.Response.StatusCode < 400 &&
                IsCorsOkContentType(context.Response.ContentType))
            {
                context.Response.Headers.Add("Access-Control-Allow-Origin", AllowedOrigin);
            }

            return Task.FromResult(0);
        }, null);

        await _next(context);
    }
}
person LexH    schedule 14.09.2017