aspnetboilerplate: Аутентификация SignalR JWT
Мы пытаемся интегрировать 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 ответ
Проведя немного больше исследований по этому вопросу, пытаясь собрать вместе тестовый проект, который я мог бы поместить на GitHub для воспроизведения проблемы, я решил ее решить.
Использование следующего внутри нашего концентратора дает нам правильный идентификатор пользователя каждый раз. Context.User.Identity.GetUserId();
Я считаю, что это должно быть ошибка внутри aspnetboilerplate сейчас. Я буду пытаться сообщить о проблеме на GitHub.