.net core 2.2 и широко открытый CORS - PullRequest
2 голосов
/ 25 апреля 2019

Начиная с .net core 2.2, мы не можем принимать все источники и принимать учетные данные одновременно.Хотя это решает проблему безопасности, есть случаи, когда нам все равно и мы хотим, чтобы все было открыто.

Итак, предлагаемое решение, которое я нашел в нескольких потоках:

    Services.AddCors(CorsOptions =>
    {
        CorsOptions.AddPolicy("AllowAll", P => { P
            .SetIsOriginAllowed(_ => true)
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials();
        });
    });

, но этопо-прежнему выдает следующую ошибку:

Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».

Каким было бы рабочее решение для широко открытого CORS с 2.2?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Я думаю, что все, что вам нужно, это как упомянуто @Praneet. Создать политику полного доступа

services
    .AddCors(options => options
        .AddPolicy("WideOpen", p => p
            .AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader())
    );

Вам также понадобится строка в методе Configure, чтобы включить ее глобально

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseCors("WideOpen");
}

ОБНОВЛЕННЫЙ ОТВЕТ

services
    .AddCors(options => options
        .AddPolicy("WideOpen", p => p
            .SetIsOriginAllowedToAllowWildcardSubdomains()
            .WithOrigins("*")
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials())
    );

Согласно документации SetIsOriginAllowedToAllowWildcardSubdomains требуется для разрешенного происхождения. Поэтому я установил WithOrigins для использования подстановочных знаков

ОБНОВЛЕННЫЙ ОТВЕТ 2

хорошо, у меня есть идея для вашей проблемы. Я не думаю, что это идеальное или рекомендуемое решение, но оно будет работать. У вас может быть промежуточное программное обеспечение, которое внедряет заголовки Response для каждого запроса, которые необходимы для разрешения AnyOrigin, AnyMethod и AnyHeader вместе с учетными данными. Тем не менее, он только добавит заголовок Access-Control-Allow-Origin для источника, который присутствует в запросе, следовательно, разрешает любое происхождение.

Если проверка Ajax не работает, вы можете удалить ее. Единственным недостатком является то, что он будет вводить заголовки для всех запросов.

public class WideOpenCorsMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)
    {
        var response = context.Response;

        // check if it's an ajax request
        if (context.Request.Headers != null && context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
        {
            response.Headers.Add("Access-Control-Allow-Origin",
                new[] { (string)context.Request.Headers["Origin"] });
            response.Headers.Add("Access-Control-Allow-Headers",
                new[] { "Origin, X-Requested-With, Content-Type, Accept" });
            response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" });
            response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" });
            response.StatusCode = 200;
        }

        // if not a pre-flight request
        if (context.Request.Method != "OPTIONS")
        {
            await _next(context);
        }
    }
}

Вы также можете использовать этот метод Extension, чтобы вы могли легко использовать его в методе Configure.

// Extension method used to add the middleware to the HTTP request pipeline.
public static class MiddlewareExtensions
{
    public static IApplicationBuilder UseWideOpenCors(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<WideOpenCorsMiddleware>();
    }
}

Наконец, в методе Configure добавьте следующую строку, возможно, вверху:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseWideOpenCors();
}
0 голосов
/ 25 апреля 2019

В вашем appsettings.json добавьте свое происхождение.Примерно так:

"CorsOrigins": {
    "Urls": [ "http://localhost:4200", "http://localhost:8090", "https://localhost:44376" ]
  }

Затем настройте свой запуск следующим образом:

var corsOriginsSection = Configuration.GetSection("CorsOrigins");
var origins = corsOriginsSection.Get<CorsOrigins>();

services.AddCors(options => options.AddPolicy("AllowSpecificOrigin", p => p.WithOrigins(origins.Urls)
                                               .AllowAnyMethod()
                                               .AllowAnyHeader()));

Затем на вашем контроллере добавьте:

 [EnableCors("AllowSpecificOrigin")]

Это должно работать.

Я бы использовал следующий класс:

public interface ICorsOrigins
{
    string[] Urls { get; set; }
}
public class CorsOrigins : ICorsOrigins
{
    public string[] Urls { get; set; }
}

Я бы сохранил происхождение в настройках приложения, иначе это будет жестко закодированная вещь.

, какконкретное происхождение, создайте политику All Access и используйте ее согласно вашему требованию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...