У меня возникают проблемы с 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.