У нас есть приложение Angular / TypeScript, которое использует технологию веб-сокетов SignalR для подключения к нашему C # .NET Core API.Для аутентификации мы отправляем наш токен доступа JWT, который мы затем можем получить и проверить на API.Это на самом деле прекрасно работает.
Однако проблема в том, что метод, используемый клиентом JavaScript веб-сокета для первоначального подключения к API, предоставляет наш токен доступа в GET-запросе.Журналы доступа к веб-серверу, журналы доступа балансировщика нагрузки, журналы прокси-серверов и другие распространенные корпоративные инструменты, такие как платформы анализа производительности, могут хранить конфиденциальную информацию, запрашиваемую методом HTTP GET.Ниже приведен код, который мы используем для подключения.
На входной стороне:
this._hubConnection = new HubConnectionBuilder()
.withUrl(this.apiPath + ?authtoken=${localStorage.getItem('access_token')})
.build();
На внутренней стороне:
if (context.Request.Path.Value.StartsWith("/hub") &&
context.Request.Query.TryGetValue("authtoken", out
Microsoft.Extensions.Primitives.StringValues token))
{
context.Token = token;
}
Это вызывает наш токен доступанепосредственно в строку запроса GET, чтобы все могли видеть.
Мы пробовали другие решения (ниже), но у нас все еще остается та же проблема. Здесь - это ссылка, где кто-то объясняет, что клиент JavaScript веб-сокета в настоящее время не поддерживает пользовательские заголовки.Есть ли способ обойти эту проблему?Нам нужно отправить токен доступа, чтобы он не подвергался опасности.
this._hubConnection = new HubConnectionBuilder()
.withUrl(this.apiPath, { accessTokenFactory: () => localStorage.getItem('access_token') })
.build();