aspnetboilerplate: аутентификация SignalR JWT - PullRequest
0 голосов
/ 02 ноября 2018

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

Проблема, с которой мы сталкиваемся, в случайные моменты времени UserId внутри AbpSession будет просто нулевой. Он проходит через атрибут [Authorize], но aspnetboilerplate, похоже, считает, что 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 Hub на сервере:

    [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 с концентратором, и я вижу, что токен передается правильно каждый раз.

1 Ответ

0 голосов
/ 07 ноября 2018

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

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

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

...