Как сделать концентраторы SignalR, которые требуют авторизации / авторизации входа / выхода из системы? - PullRequest
0 голосов
/ 21 мая 2018

У меня есть простая реализация чата в SignalR.Каждый может прочитать, что пишут другие, но говорить могут только зарегистрированные пользователи:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

namespace WebApplication1.Hubs
{
    public class ChatHub : Hub
    {
        [Authorize]
        public async Task SendMessage(string message)
        {
            await Clients.All.SendAsync("ReceiveMessage", Context.User.Identity.Name, message);
        }
    }
}

И это работает.Кроме ... Когда пользователь открывает чат на одной вкладке, но входит / выходит из системы на другой вкладке.

  • Когда пользователь выходит из другой вкладки, он все еще может свободно говоритьв чате.Чат отправляет свои сообщения с никнеймом, который у них был до выхода из системы.Это продолжается до тех пор, пока вкладка чата не будет перезагружена.
  • Когда пользователь не вошел в систему, но по-прежнему открывает чат на одной вкладке, а затем входит на другой вкладке, они могут по-прежнему не разговаривать в чате, пока не перезагрузятвкладка чата.

Почему, несмотря на наличие атрибута [Authorize], метод SendMessage все еще работает, даже если пользователь больше не проходит проверку подлинности?

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

ASP .NET Core 2.1 RC1, потому что 2.0 не поддерживает SignalR.

РЕДАКТИРОВАТЬ: согласно запросу из комментариев, Startup.Configure:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseAuthentication();

    app.UseSignalR(routes =>
    {
        routes.MapHub<ChatHub>("/chathub");
    });

    app.UseMvc();
}

1 Ответ

0 голосов
/ 24 мая 2018

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

Как вы сказали, когда пользователь выходит из системы, вы можете открыть другой сокет, чтобы отправить сообщение на все вкладки, которые пользователь вошел в систему.выкл.

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

Другим решением будет использование Shared Worker.или широковещательный канал для отправки сообщения между вкладками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...