aspnetboilerplate: Аутентификация SignalR JWT

Мы пытаемся интегрировать SignalR в стороннее приложение, чтобы общаться с нашими концентраторами для нашего приложения aspnetboilerplate. Это использует шаблон .NET Core. У нас возникла проблема с сеансом в aspnetboilerplate, имеющим null UserId даже при прохождении атрибута на нашем концентраторе для проверки авторизации.

Проблема, с которой мы сталкиваемся, заключается в том, что случайным образом UserId внутри AbpSession будет просто нулевым. Он проходит мимо атрибута [Authorize], но aspnetboilerplate, похоже, думает, что UserId имеет значение null в случайное время. Я могу вызвать метод в нашем хабе и увидеть, что UserId подходит для этого пользователя. Затем в следующий раз, когда я вызываю тот же метод на хабе с тем же пользователем, UserId внутри AbpSession равен null., я могу снова вызвать метод, и UserId иногда будет null или иногда будет правильным. Кажется, что в этом вопросе нет никакой последовательности. Время от времени он будет чередоваться между null и правильным UserId.

Наш клиентский код:

let connection = new signalR.HubConnectionBuilder()
.withUrl('ENTER HUB URL HERE',
{
  transport: signalR.HttpTransportType.LongPolling,
  accessTokenFactory: () => {
    return 'BEARER TOKEN HERE'
 }}).build()

 connection.invoke('sendGroupMessage', text, hardCodedChatGroup)

Вот образец нашего концентратора SignalR на сервере:

    [AbpMvcAuthorize]
public class OpenChatHub : Hub, ITransientDependency
{
    public IAbpSession AbpSession { get; set; }

    public ILogger Logger { get; set; }

    public OpenChatHub()
    {
        AbpSession = NullAbpSession.Instance;
        Logger = NullLogger.Instance;
    }

    public async Task SendGroupMessage(string message, string groupName)
    {
        // logic for the SendGroupMessage would be here
        var msg = new
        {
            sendById = AbpSession.UserId, // this will be null at random times
            message = message
        };
        await Clients.Group(group).SendAsync("receiveChatMessage", msg);
    }
}

Я могу просматривать запросы на согласование SignalR и взаимодействие с концентратором, и я вижу, что токен каждый раз передается правильно.


person twigman08    schedule 02.11.2018    source источник
comment
Создайте репро-проект на GitHub.   -  person aaron    schedule 03.11.2018
comment
@aaron Я посмотрю, смогу ли я получить небольшой проект на GitHub, чтобы проверить это. Аутентификация на основе файлов cookie с использованием приложения в веб-браузере, похоже, работает нормально (тем не менее, необходимо провести дополнительное тестирование). Похоже, что когда мы используем JWT в приложениях, которых нет в браузере (например, в мобильном приложении.   -  person twigman08    schedule 05.11.2018


Ответы (1)


Проведя немного больше исследований по этому поводу, пытаясь собрать тестовый проект, который я мог бы разместить на GitHub, чтобы воспроизвести проблему, я решил ее решить.

Использование следующего внутри нашего хаба теперь каждый раз дает нам правильный UserId. Context.User.Identity.GetUserId();

Я считаю, что теперь это ошибка внутри aspnetboilerplate. Я постараюсь сообщить о проблеме на GitHub.

person twigman08    schedule 06.11.2018
comment
Ну есть репро? - person aaron; 07.11.2018
comment
Да, есть один. Извините, я еще не создал его до того, как опубликовал это. Хотели сначала опубликовать проблему на своем GitHub. github.com/chadsmith12/SignalRTest - person twigman08; 07.11.2018