首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使需要授权的SignalR集线器允许登录/注销?

如何使需要授权的SignalR集线器允许登录/注销?
EN

Stack Overflow用户
提问于 2018-05-21 10:47:54
回答 1查看 590关注 0票数 0

我在SignalR中有一个简单的聊天实现。每个人都可以阅读其他人正在输入的内容,但只有注册用户才能说:

代码语言:javascript
复制
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);
        }
    }
}

而且它是有效的。除了..。当用户在一个选项卡中打开聊天,而在另一个选项卡中登录/退出时。

  • 当用户在另一个选项卡中登录时,他们仍然可以在聊天中自由发言。聊天发送他们的信息,他们的尼克,他们在登录之前。这种情况一直持续到chat选项卡重新加载为止。
  • 当用户未登录,但仍在一个选项卡中打开chat,然后在另一个选项卡中登录时,在重新加载chat选项卡之前,他们仍可能不会在chat中说话。

为什么尽管存在[Authorize]属性,即使用户不再经过身份验证,SendMessage方法仍然工作呢?

怎么解决这个问题?如何使我的聊天中心跟踪在客户端连接后发生的身份验证?

ASP .NET Core2.1 RC1,因为2.0不支持SignalR。

编辑:根据评论中的请求,Startup.Configure

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-24 12:34:58

在websocket中,凭据仅用于建立连接,而不是包含在每个帧中。因此,一旦连接建立,signalr就无法知道用户已经注销了。

正如您所说的,当用户注销时,您可以打开另一个套接字向用户注销的所有选项卡发送消息。

或者,您可以通过javascript周期性地检查cookie,如果用户还没有登录,则关闭signalr连接。

另一种解决方案是使用共享工作人员或广播频道在选项卡之间发送消息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50447184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档