我在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 Core2.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();
}发布于 2018-05-24 12:34:58
在websocket中,凭据仅用于建立连接,而不是包含在每个帧中。因此,一旦连接建立,signalr就无法知道用户已经注销了。
正如您所说的,当用户注销时,您可以打开另一个套接字向用户注销的所有选项卡发送消息。
或者,您可以通过javascript周期性地检查cookie,如果用户还没有登录,则关闭signalr连接。
另一种解决方案是使用共享工作人员或广播频道在选项卡之间发送消息。
https://stackoverflow.com/questions/50447184
复制相似问题