Проблемы разработки политики CORS даже после того, как все заголовки и происхождение разрешены - PullRequest
0 голосов
/ 02 июля 2019

У меня есть dotnetcoreapp2.1, в котором я использую SignalR.Я включил все источники для тестирования и все заголовки, но я получаю следующие ошибки:

.. заблокирован политикой CORS: Ответ на запрос перед полетом не проходит проверку контроля доступа: Значениезаголовка «Access-Control-Allow-Origin» в ответе не должно быть подстановочным знаком «*», если режим учетных данных запроса «include».Режим учетных данных запросов, инициированных XMLHttpRequest, контролируется атрибутом withCredentials.

Я использую следующую конфигурацию:

public void ConfigureServices(IServiceCollection services)
        {

            services.AddCors(o => o.AddPolicy("MyCORSPolicy", builder =>
            {
                builder.AllowAnyOrigin()
                       .AllowAnyMethod()
                       .AllowCredentials() // DisallowCredentials doesn't work either
                       .AllowAnyHeader();
            }));

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            services.AddSignalR();

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {

            app.UseCors("MyCORSPolicy");

            app.UseHttpsRedirection();

            app.UseMvc();

            app.UseSignalR(routes =>
            {
                routes.MapHub<VehiclesHub>("/vehiclesHub");
            });

            app.UseWebSockets();

        }

Теперь проблема заключается в том, что я получаю этоошибка при попытке получить доступ к этому концентратору из веб-приложения реагирования.Но если я попробую его из React native, я получу

Не удалось запустить транспорт 'websockets' null

Я даже использовал на своем концентраторе или других контроллерах

[EnableCors("MyCORSPolicy")]

Эта проблема возникала на всех контроллерах web api 2, но теперь мне не удается только с концентратором SignalR.Другие конечные точки API работают нормально.

РЕДАКТИРОВАТЬ:

Мое приложение dotnetcore2.2 размещено на сервере IIS.

1 Ответ

0 голосов
/ 08 июля 2019

Что ж, похоже, что в моем случае происхождение не является проблемой, так как пользователи будут получать доступ к данным, используя свои учетные данные.Я больше исследовал, что CORS предназначен для браузеров, в основном, где пользователям могут быть внедрены скрипты с перекрестным происхождением, и им может быть нанесен вред.

Так что решение, которое я нашел в моем посте на Github, заключалось в создании специального промежуточного программного обеспечения, которое решает эту проблему.Поскольку у меня не было никакого контроля над withCredentials, используемым в ASP.NET Core Signalr, поэтому возвращение того же источника с использованием промежуточного программного обеспечения является лучшим вариантом здесь:

public class CorsOverride
{
  private readonly RequestDelegate _next;

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

  public async Task Invoke(HttpContext httpContext)
  {
    const string allowOriginHeaderName = "Access-Control-Allow-Origin";
    if (httpContext.Response.Headers.ContainsKey(allowOriginHeaderName))
    {
      httpContext.Response.Headers.Remove(allowOriginHeaderName);
    }

    httpContext.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    httpContext.Response.Headers.Add("Access-Control-Allow-Headers", "x-requested-with");

    if (httpContext.Request.Headers["Access-Control-Request-Method"].Count > 0)
    {
      foreach (var header in httpContext.Request.Headers["Access-Control-Request-Method"])
      {
        httpContext.Response.Headers.Add("Access-Control-Allow-Methods", header);
      }
    }
    else
    {
      httpContext.Response.Headers.Add("Access-Control-Allow-Methods", httpContext.Request.Method);
    }

    foreach (var origin in httpContext.Request.Headers.Where(h => h.Key == "Origin"))
    {
      httpContext.Response.Headers.Add(allowOriginHeaderName, origin.Value);
    }

    if (httpContext.Request.Method == "OPTIONS")
    {
      httpContext.Response.StatusCode = 200;
      await httpContext.Response.WriteAsync("");
    }
    else
    {
      await _next.Invoke(httpContext);
    }
  }
}

Оригинальное решение на моем посту Github , Моя статья по обработке CORS

Если у кого-то есть какие-либо возражения с этим типом исправления, пожалуйста, порекомендуйте ниже.

...