HandleAuthenticateAsync вызывается несколько раз

#asp.net-core #signalr

Вопрос:

Когда я пытаюсь подключиться к концентратору SignalR HandleAuthenticateAsync() , метод в AuthenticationHandler нем вызывается дважды клиентом .net и 3 раза другим клиентом.

Но когда я вызываю метод http, обработчик вызывается только один раз.

это мое ConfigureServices() в Startup

         services.AddAuthentication(FbigAuthenticationHandler.PROVIDER_NAME)
        .AddScheme<FbigAuthenticationSchemeOptions, FbigAuthenticationHandler>(FbigAuthenticationHandler.PROVIDER_NAME, null);

        services.AddCors();
        services.AddControllers();
        services.AddSignalR(options =>
        {
            options.AddFilter<BadUserInputFilter>();
            options.ClientTimeoutInterval = TimeSpan.FromHours(1); //change this in production
        });


        services.AddHangfire(configuration =>
        {
            configuration.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseSimpleAssemblyNameTypeSerializer()
                .UseMemoryStorage()
                .WithJobExpirationTimeout(TimeSpan.FromHours(3))
                .UseDefaultTypeSerializer();
        });

        services.AddHangfireServer();
 

и Configure()

         app.UseCors(builder => builder
               .AllowAnyOrigin()
               .AllowAnyHeader()
               .AllowAnyMethod()
           );

        app.UseAuthentication();

        app.UseRouting();

        app.UseEndpoints(endpoint => endpoint.MapHub<MasterHub>("/connect"));

        app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
 

Ответ №1:

По умолчанию SignalR выполняет минимум 2 запроса, один для /<hubname>/negotiate конечной точки, а другой для /<hubname> конечной точки. Чтобы иметь только один запрос, вы можете указать WebSockets и пропустить согласование в параметрах клиента. (Предостережение заключается в том, что среды без websockets не будут работать, и вы не сможете использовать службу Azure SignalR)

Комментарии:

1. Сейчас я пропускаю мимо клиента, но что, если я захочу договориться, будет ли нормально вернуть AuthenticateResult. Успех(билет), когда я нахожу его запросом на переговоры? потому что я не могу обрабатывать аутентификацию дважды, когда она обращается к другому api для проверки токена один раз