Ошибка предварительного согласования SignalR - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть сценарий, когда мой сервер и клиент 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 Версия ядра - 3.1, версия SignalR - @ microsoft / signalR - 3.1.3
  • IDE (VS / VS Code / VS4Ma c), на которой вы работаете, и ее версия - локально визуальная студия 2019, в Azure - Azure службе приложений.

1 Ответ

0 голосов
/ 23 апреля 2020

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

...