У меня есть простая реализация чата в 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();
}