Токен JWT из NetCore не загружается на QueryString из SignalR с Angular - PullRequest
0 голосов
/ 29 марта 2020

Привет, ребята. У меня возникли некоторые проблемы с SignalR на NET Core 2.2 и Angular, когда angular пытается установить соединение, проходящее через токен, выдает эту ошибку:

enter image description here

Сам код очень прост, я никогда не работал с SignalR, поэтому это мой первый раз. Я много искал на inte rnet, форумах и т. Д. c, но на самом деле ничего не помогло мне это исправить.

public class WebSocketsMiddleware
    {
        private readonly RequestDelegate _next;

        public WebSocketsMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            var request = httpContext.Request;

            // web sockets cannot pass headers so we must take the access token from query param and
            // add it to the header before authentication middleware runs
            if (request.Path.StartsWithSegments("/hub/signalr/test/notification", StringComparison.OrdinalIgnoreCase) &&
                request.Query.TryGetValue("access_token", out var accessToken))
            {
                request.Headers.Add("Authorization", $"Bearer {accessToken}");
            }

            await _next(httpContext);
        }
    }

Я создал промежуточное ПО для получения токена строка запроса от сигнализатора, но она отправляет мне ноль, токен даже не появляется нигде. Я выполняю некоторые шаги, которые прочитал, и добавил фильтр авторизации для класса, потому что для методов внутри класса-концентратора мне нужны утверждения и информация о пользователе электронной почты и кода.

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    public class NotificationHub : Hub
    {
        [HubMethodName("MessageToAll")]
        public async Task SendMessageToAll(string mensagem)
        {
            try
            {
                string connectionid = Context.ConnectionId;

                string name = Context.User.Identity.Name;

                var IdUser = Extentions.Extentions.GetClaimValue(Context.User.Claims, "CodUser");
                var EmailUser = Extentions.Extentions.GetClaimValue(Context.User.Claims, "Email");

                await Clients.All.SendAsync("SendToAll", mensagem);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
   }

и это мой класс запуска

enter image description here

Кроме того, я создал простое приложение angular только для тестирования уведомления в SignalR с токеном. Большинство форумов и исследований, которые я видел, говорят о websocket и токене, которые должны передаваться строкой запроса, а не методом http, потому что браузеры не поддерживают его. Тем не менее, я получаю проблемы и получаю токен серверную часть с Netcore.

import { Component, OnInit } from '@angular/core';
import { HubConnectionBuilder  } from '@microsoft/signalr';
import { HubConnection } from '@aspnet/signalr';
import * as signalR from '@aspnet/signalr';
import { Message } from 'primeng/api';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {

  title = 'client';
  private _messagingHubConnection: HubConnection | undefined;
  private _hubConnection: HubConnection;
  msgs: Message[] = [];

  constructor()
  {
    this.buildconnection();
  }

  ngOnInit(): void {
    this._messagingHubConnection
    .start()
    .then(() => 
    {
        this._messagingHubConnection.send("MessageToAll","teste rafael");
        console.log("mensagem enviada");
    }).catch(err => console.log(err));

    this._messagingHubConnection.on("SendToAll",(mensagem: string) => {
      console.log('Mensagem recebida: ' + mensagem);
    });

  }

  public buildconnection = () =>
  {
    this._messagingHubConnection = new signalR.HubConnectionBuilder()
    .configureLogging(signalR.LogLevel.Information)
    .withUrl("http://localhost:63541/hub/signalr/test/notification", 
    { 
        transport: signalR.HttpTransportType.WebSockets,
       accessTokenFactory: () => "jwt_token" 
    }).build();
  }

  public startconnection = () =>
  {
    this._messagingHubConnection
    .start()
    .then(() => 
    {
        console.log('Connection started! State: ' + this._messagingHubConnection.state);
        this._messagingHubConnection.send("MensagemCustomizada", 1123, "teste rafael");
    }).catch(err => console.log("Error while establishing connection :( " + err));
  }



}
...