Как получить идентификацию пользователей, подключенных к SignalR, которые используют клиентское приложение mvc с аутентификацией owin? - PullRequest
0 голосов
/ 15 марта 2020

В моем решении у меня есть 2 проекта: SignalRServer , WebClient , которые оба MVC приложение . На моем сервере я использовал SignalR 2 Hub , а в клиентском проекте я использовал библиотеку jquery SignalR для подключения к хаб-серверу, передавая URL-адрес размещенного сервера в качестве URL-адреса хаб-соединения. .

Все работает также, и клиент может получать сообщения с сервера.

Проблема: в клиентском проекте я добавил аутентификацию, и пользователи должны ввести свое имя пользователя и пароль, чтобы просмотреть страницу, сообщения которой будут смотреться. Теперь я хочу получить зарегистрированное имя пользователя, которое подключилось к SignalR Hub Server , и отправить соответствующие сообщения каждому пользователю, используя это имя пользователя.

Как узнать, какой пользователь подключился к серверу во время проверка подлинности обрабатывается в клиентском проекте, отделенном от серверного проекта?

JQuery клиентский концентратор:

var PbxHub = $.connection.pbxhub;

$.connection.hub.url = "http://localhost:10437/signalr";
$.connection.hub.logging = true;

$.connection.hub.start({
    jsonp: true,
    withCredentials: false
}).done(function () {
    console.log('Hub is connected.');
});

$.connection.hub.disconnected(function () {
    console.log('Hub is disconnected.');
    setTimeout(function () {
        $.connection.hub.start();
    }, 1500); // Restart connection after 1500 miliseconds.
});

Запуск клиента:

public void Configuration(IAppBuilder app)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Home/Login"),
    });
}

Запуск сервера:

    public void Configuration(IAppBuilder app)
    {
        app.Map("/signalr", map =>
        {
            var hubConfiguration = new HubConfiguration
            {
                EnableJavaScriptProxies = true,
                EnableJSONP = true,
                EnableDetailedErrors = true
            };

            map.UseCors(CorsOptions.AllowAll);
            map.RunSignalR(hubConfiguration);
        });
    }

Ценится за любую идею.

1 Ответ

0 голосов
/ 16 марта 2020

Как описано в документации Microsoft здесь https://docs.microsoft.com/en-us/aspnet/core/signalr/authn-and-authz?view=aspnetcore-3.1#cookie -утентификация

В приложении на основе браузера аутентификация cook ie позволяет автоматически передавать текущие учетные данные пользователя к сигналам SignalR. При использовании клиента браузера дополнительная настройка не требуется. Если пользователь вошел в ваше приложение, соединение SignalR автоматически наследует эту аутентификацию.

Итак, используя тот же DBContext, который использовался в клиентском приложении, я мог получить доступ к connectionId пользователей, подключенных к хабу. и либо вставлять записи в базу данных после отправки им сообщений.

    if (_context.Extension.Any(ex=>ex.Code.ToString() == deviceName))
    {
        extensionID = _context.Extension.SingleOrDefault(ex => ex.Code.ToString() == deviceName).ID.ToString();
    }
    else { return; }

    asterHub.Clients.User(extensionID).SendState(
            e.Device_state.Name,
            string.Format("{0}:{1}:{2}",
                pc.GetHour(DateTime.Now),
                pc.GetMinute(DateTime.Now),
                pc.GetSecond(DateTime.Now)),
            state,
            stateCode);
...