SignalR токен аутентификации бесконечный цикл - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь настроить signalR с аутентификацией токена на основе официальной документации здесь https://docs.microsoft.com/en-us/aspnet/core/signalr/authn-and-authz?view=aspnetcore-2.2#bearer -token-authentication (обратите внимание, что я использую aspnetcore 2.2), но она не работает. Я получил бесконечный l oop с кодом ниже. Я также попытался настроить промежуточное программное обеспечение и передал токен в заголовках авторизации.

hub. js

const connection = new signalR.HubConnectionBuilder().withUrl('/hub').build();

Hub.cs

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

Startup.cs

           services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options =>
            {
                options.Events = new JwtBearerEvents
                {
                    OnMessageReceived = context =>
                    {
                        var accessToken = context.Request.Query["access_token"];

                        var path = context.HttpContext.Request.Path;
                        if (!string.IsNullOrEmpty(accessToken) && (path.StartsWithSegments("/hub")))
                        {
                            context.Token = accessToken;
                        }
                        return Task.CompletedTask;
                    }
                };
            });

Буду признателен за любую помощь.


РЕДАКТИРОВАТЬ: будьте осторожны, когда вы пытаетесь объединить сигналы с Azure! Вам нужно следовать другой документации, и ссылка https://docs.microsoft.com/en-us/azure/azure-signalr/signalr-tutorial-authenticate-azure-functions

1 Ответ

0 голосов
/ 09 марта 2020

Вам необходимо передать токен при вызове концентратора, например:

const connection = new signalR.HubConnectionBuilder()
      .withUrl('/hub', 
      {
        accessTokenFactory: () => token //your token here
      })
      .build();

Edit1: Поскольку вы хотите использовать независимый токен, вы должны внедрить его в свой класс концентратора, например:

/**
 * Configure signalR events
 */
private configureSignalR(signalRUrl: string, token: string) {
  this.hubConnection = new signalR.HubConnectionBuilder()
    .configureLogging(signalR.LogLevel.Error).withUrl(signalRUrl + "/hub",
      {
        accessTokenFactory: () => token
      })
    .withAutomaticReconnect()
    .build();
}

На сервере вы настраиваете свою собственную политику авторизации (независимую, только для концентратора) и передаете ее атрибуту.

[Authorize("CustomHubPolicy")]
...