SignalR согласовать предварительный запрос не удалось

У меня есть сценарий, в котором мой сервер SignalR и клиент не могут работать в одном источнике, потому что мы хотели бы использовать сервер SignalR для нескольких источников. Когда я запускаю сервер локально и запускаю экземпляр веб-клиента signalR, работающего в машинописном тексте, я могу подключиться, и все работает. Когда я перемещаю свой сервер в Azure и использую тот же локально работающий клиент signalR для подключения к серверу, я получаю предполетный запрос, который не проходит проверку контроля доступа. В службе приложений Azure нет настроек COR. Все настройки Cors выполняются в коде сервера. Код ниже.

Ошибка, которую я получаю в браузере: Доступ к XMLHttpRequest по адресу https: //******.azurewebsites.net/chatHub/negotiate ?gotiateVersion = 1 'from origin' https://localhost:44392 'заблокирован политикой CORS: ответ на предварительный запрос не проходит проверку контроля доступа: Перенаправление не разрешено для предварительного запроса. Это работает должным образом локально, но в конечном итоге работает некорректно при работе в Azure и подключении с локального клиента.

Воспроизводить

public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options => options.AddPolicy("MyCorsPolicy", builder =>
            {
                builder
                  .AllowAnyHeader()
                  .WithOrigins("https://localhost:44392/")
                  .SetIsOriginAllowed(origin =>
                  {
                      if (string.IsNullOrWhiteSpace(origin))
                          return false;

                      if (origin.ToLower().StartsWith("https://localhost"))
                          return true;
                      return false;
                  })
                  .AllowAnyMethod()
                  .AllowCredentials();
            }));
            ... //Authentication etc
            services.AddSignalR(hubOptions =>
            {
                hubOptions.EnableDetailedErrors = true;
            }).AddJsonProtocol();
        }

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseRouting();
            app.UseCors("MyCorsPolicy");
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseHttpsRedirection();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Ping!");
                });
                endpoints.MapHub<ChatHub>("/chatHub");
            });
         }

В клиенте машинописного текста я делаю запрос следующим образом:

const connection = new HubConnectionBuilder()
        .withUrl("https://******.azurewebsites.net/chatHub" , { accessTokenFactory: () => "TOKEN GOES HERE"})
        .configureLogging(LogLevel.Information)
        .build();

Дополнительные технические детали

  • Версия ASP.NET Core - 3.1, версия SignalR - @ microsoft / signalR - 3.1.3
  • IDE (VS / VS Code / VS4Mac), в которой вы работаете, и ее версия - локально Visual Studio 2019, в Azure - служба приложений Azure.

person Amit Vig    schedule 22.04.2020    source источник


Ответы (1)


Отметка проблемы как закрытой. Это было сложно, потому что это работало локально, но не работало в Azure. После просмотра журналов приложений и сетевых трассировок @BrennanConroy заметил, что что-то, связанное с аутентификацией, вызывает перенаправление. Я настроил аутентификацию в Azure, и, поскольку это первое, что запускается, CORS из приложения не может работать. Способ справиться с этим - использовать CORS в Azure, но согласно документации CORS в службе приложений не поддерживается для SignalR, следует отметить, что проверка подлинности в службе приложений Azure приведет к проблемам с CORS.

person Amit Vig    schedule 23.04.2020