Изменение идентификатора пользователя во время активного соединения SignalR - как восстановить соединение?

У меня возникают проблемы с SignalR и пользователями, изменяющими личность в приложении ASP.NET MVC 4. Я использую проверку подлинности с помощью специального поставщика членства.

В представлении, в котором у меня есть SignalR on, также есть кнопка входа в систему (и выход из системы), и крайне важно, чтобы как зарегистрированные, так и зарегистрированные пользователи могли просматривать это представление (и все они подключены к группе SignalR связанные с этим представлением). Тем не менее, у меня возникают проблемы при входе в систему. Какая рекомендуемая практика "повторно подключить" базовое соединение SignalR при изменении идентификатора пользователя? Представление является одним из нескольких других представлений, показанных другими действиями. Это единственный, в котором включен JavaScript-код SignalR.

На самом деле, меня даже не интересует личность пользователя, поэтому отвращение к аффинности с пользователем как-то было бы в порядке (но я не мог найти способ сделать это). Также было бы нормально, если пользователь изменит загрузку страницы, поскольку вход/выход из системы произошел в окне, отличном от того, которое поддерживает соединение, поэтому последнее не имеет фокуса пользователя.

Вопрос, другими словами: Как сохранить базовое соединение SignalR, когда идентификатор пользователя изменится с зарегистрированного пользователя на пользователя, который вышел из системы, и наоборот?

Вещи, которые я пробовал

  • Обработка событий входа/выхода на странице, например:  $("a[href='/Account/Logout']").click(function () { $.connection.hub.stop(); });

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

  • Добавление дополнительной группы в концентратор, который связан с идентификатором сеанса ASP.NET, который остается согласованным между входом и выходом. При входе в систему или выходе из системы я уведомил клиента, отправив группе с этим идентификатором сеанса триггер для повторного подключения. Это оказалось слишком поздно, к концу запроса идентификация уже была изменена, поэтому исключение было запущено.

Подробнее о моей настройке

Для этого конкретного случая использования пользователю предоставляется страница, содержащая SignalR. Я присоединяюсь к хабу как обычно:

var hub = $.connection.theNameOfTheHub;
$.connection.hub.start().done(function () {
  hub.server.joinList(id);
});

В этом примере я изменил несколько имен. В принципе, я хочу отслеживать изменения в списке элементов, отображаемых на странице. Я присоединяюсь к группе, используя идентификатор списка в качестве идентификатора.

Сообщение об исключении: "System.InvalidOperationException: непризнанный идентификатор пользователя. Идентификатор пользователя не может меняться во время активного соединения SignalR". и он исходит от Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId. Я просмотрел источник и сравнивает фактический context.Request.User.Identity.Name с тем, который был сохранен в токен соединения. Все это имеет смысл, но то, что я ищу, является обходным путем.

Я использую Microsoft.AspNet.SignalR 1.1.2.

Ответ 1

это просто, не полагайтесь на идентификацию пользователя, вместо этого создайте свой собственный файл cookie, в котором вы можете отслеживать каждого пользователя независимо от того, был ли этот пользователь зарегистрирован или нет. так же, как многие AD-сообщества имеют файлы cookie для отслеживания пользователей, даже если они не вошли в систему.