Подтвердить что ты не робот

Передача токена через http Headers SignalR

Я вижу, что в HubConnection есть опция для передачи параметров по запросу url от клиента. Есть ли способ передать конкретный токен через HTTP-заголовки из JS или .NET-клиентов?

4b9b3361

Ответ 1

Невозможно установить HTTP-заголовки для запросов SignalR с использованием клиента JS или .NET, но вы можете добавить параметры в строку запроса, которая будет отправлена ​​как часть каждого запроса SignalR:

JS Client

$.connection.hub.qs = { "token" : tokenValue };
$.connection.hub.start().done(function() { /* ... */ });

Клиент .NET

var connection = new HubConnection("http://foo/",
                                   new Dictionary<string, string>
                                   {
                                       { "token", tokenValue }
                                   });

Внутри концентратора вы можете получить доступ к имени сообщества через контекст:

Context.QueryString["token"]

Вы также можете добавить строку запроса при создании постоянных подключений.

EDIT: теперь можно настроить заголовки на клиентском компьютере .NET SignalR, как указано некоторыми комментаторами.

Настройка заголовков в .NET Client

var connection = new HubConnection("http://foo/");
connection.Headers.Add("token", tokenValue);

Ответ 2

Вы можете добавлять заголовки в Connection или HubConnection с помощью .NET client (как упоминает @abnanda):

var connection = new Connection("http://signalr/");
connection.Headers.Add("custom-header", "value");

На стороне сервера вы можете получить значение заголовка из IRequest, например. OnConnected:

var header = request.Headers["custom-header"];

Однако я еще не нашел способ сделать это с помощью JS-клиента (нет заголовков или addHeaders в объекте $connection).

Я опубликовал вопрос по этому поводу: http://forums.asp.net/t/1910020.aspx/1?Add+custom+HTTP+header+on+client+side+connect+call+SignalR+1+1+1+

EDIT: Заголовки не отображаются, так как клиент websocket (в браузере) не поддерживает его (поэтому реализовать его через транспорты невозможно). См. Ответ Дэвида Фаулера в сообщении выше.

Ответ 3

Я решил это, добавив свою информацию в querystring, который доступен по методу IConnected.Connect().

В .NET-клиенте вы передаете querystring into your HubConnection:

var connection = new HubConnection("http://localhost:8080/", "myInfo=12345");

На клиенте JS вы устанавливаете свойство qs перед запуском соединения:

$.connection.hub.qs = "myInfo=12345";

Затем вы можете получить доступ к этой информации на сервере в методе Connect():

var myInfo = Context.QueryString["myInfo"];
Groups.Add(Context.ConnectionId, myInfo);