ASP .NET Core, SignalR (WebSocket) не соединен с AuthorizeAttribute

В моем примере проекта у меня есть проблема с SignalR и протоколом WebSocket Trasport. Когда я пытаюсь соединиться с концентратором в AuthorizeAttribute, ответ:

Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: Запрос запуска HTTP / 1.1 POST http://localhost:44341/chat/negotiate текст /plain;charset=UTF-8 0 Microsoft.AspNetCore.Cors.Infrastructure.CorsService: Информация: Выполнение политики успешно. Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler: Информация: успешно проверен токен. Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Информация: авторизация прошла успешно. Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: запрос завершен в 37.4131ms 200 заявке /json. Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: запрос на запуск HTTP / 1.1 GET http://localhost:44341/chat?id=bSfQQIMQk3-AWf7jTVfwsw&access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYW5kcmVhLnRvc2F0byIsImV4cCI6MTUzNDQ5OTI5NywiaXNzIjoiY2xvdWRnZW4uY29kZWdlbi5jb20iLCJhdWQiOiJjbG91ZGdlbi5jb2RlZ2VuLmNvbSJ9.47NxR5bGKWqPyPDi7Yz_PaYJTHKUJcJyRWfftxJRBq4
Microsoft.AspNetCore.Cors.Infrastructure.CorsService: Информация: Выполнение политики успешно. Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Информация: авторизация не удалась. Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler: Информация: AuthenticationScheme: Носитель был подвергнут сомнению.

Клиент, после WebSocket, потерпел неудачу с событиями отправки сервера. С Лонг-опросом все работает нормально.

Мой клиент:

      this.connection = new HubConnectionBuilder()
      .withUrl(environment.baseHubs + '/chat', {
        accessTokenFactory: () => token,
        logger: LogLevel.Trace
      })
      // .withHubProtocol(new JsonHubProtocol())
      .withHubProtocol(new MessagePackHubProtocol())
      .build();


  this.connection.start()
                 .catch(this.errorConnection.bind(this))
                 .then(x => {
                    this.connection.invoke('GetUserContext').then(this.getUserContext.bind(this));
                  });

Полный код

Код моего сервера:

         services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["Authentication:Issuer"],
                    ValidAudience = Configuration["Authentication:Audiance"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Authentication:SecurityKey"]))
                };
            });

Полный код

1 ответ

Разрешение:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {   
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["Authentication:Issuer"],
                    ValidAudience = Configuration["Authentication:Audiance"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Authentication:SecurityKey"]))
                };
                options.Events = new JwtBearerEvents
                {
                    OnMessageReceived = context =>
                    {
                        var accessToken = context.Request.Query["access_token"];
                        if (!string.IsNullOrEmpty(accessToken))
                        {
                            context.Token = accessToken;
                        }
                        return Task.CompletedTask;
                    }
                };
            });
Другие вопросы по тегам