Получение токена JWT в концентраторе SignalR

У меня есть два требования:

  1. Я хочу, чтобы мои SignalR концентраторы требовали аутентификации
  2. Когда приходит запрос, я хочу, чтобы он пришел с JWT token, чтобы я мог получить пользовательские данные.

Важно отметить, что я использую SignalR Core, который все еще находится в альфа-версии и похоже, что в API произошли некоторые изменения.

Я проводил некоторые исследования по этому поводу в течение последних нескольких часов, и я немного смущен тем, как передать JWT Token на стороне клиента и получить его на стороне сервера.


person Sam    schedule 06.01.2018    source источник


Ответы (1)


Вы можете передать jwt в качестве параметра строки запроса при подключении к концентратору, а затем добавить токен в качестве заголовка в промежуточное ПО. Вот очень простой пример.

JS

let connection = new signalR.HubConnection('http://localhost/messagesHub', {jwtBearer: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ'});

connection.on('Send', data => {
    console.log(data);
});

connection.start()
          .then(() => connection.invoke('Send', 'test'));

Добавьте в Startup.cs Configure{} вверху, как можно выше

app.Use(async (context, next) =>
{
    if (context.Request.Query.TryGetValue("token", out var token))
    {
        context.Request.Headers.Add("Authorization", $"Bearer {token}");
    }
    await next.Invoke();
});

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

Имейте в виду, что вы передаете JWT в строке запроса, поэтому просто помните о различных проблемах безопасности и вносите изменения, чтобы помочь с ними бороться (например, https)

person garethb    schedule 09.01.2018