【发布时间】:2016-02-02 09:00:31
【问题描述】:
问题:如何管理匿名用户,以便在 Hub 发出响应时更新单个浏览器中的多个选项卡?
场景如下:
我想将 SignalR 集成到一个项目中,以便匿名用户可以与操作员进行实时聊天。显然,已通过 iIdentity 进行身份验证的用户是通过 Client.User(username) 命令映射的。但目前说一个匿名用户正在浏览 site.com/tools 和 site.com/notTools 我无法将消息发送到只有一个 connectionID 的所有选项卡。只有一个选项卡收集响应。
我曾尝试使用 IWC 补丁,但该工具不考虑将聊天信息保存到数据库中,而且我认为通过 ajax 传递变量不是读取/写入数据库的安全方法。
我还查看了以下内容:Managing SignalR connections for Anonymous user
但是,创建这样的基础并使用会话似乎不如 Owin 安全。
我的想法是使用 client.user(),方法是在用户每次连接时创建一个虚假帐户,并在他们断开连接时将其删除。但我宁愿不要用垃圾帐户填充我的 aspnetusers db 上下文,这似乎没有必要。
是否可以使用UserHandler.ConnectedIds.Add(Context.ConnectionId); 来映射假用户名?我不知所措。
使用 iUserId 提供者有意义吗?
public interface IUserIdProvider
{
string GetUserId(IRequest request);
}
然后创建一个将 IP 地址存储到 connectionID 和单个用户名的数据库?
数据库:
用户:使用 FK 连接 ID
|userid|username|IP |connectionIDs|
| 1 | user1 |127.0.0.1| 1 |
| 2 | user2 |127.0.0.2| 2 |
连接ID:
|connectionID|SignalRID|connectionIDs|
| 1 | xx.x.x.x| 1 |
| 2 | xx.xxx.x| 2 |
| 3 | xx.xxxxx| 2 |
| 4 | xxxxx.xx| 2 |
那么可能围绕连接编写逻辑?
public override Task OnConnected()
{
if(Context.Identity.UserName != null){
//add a connection based on the currently logged in user.
}
else{
///save new user to database?
}
}
但问题仍然存在,当在 websocket 上发送命令时,我将如何处理多个选项卡?
更新 需要明确的是,我的意图是创建一个实时聊天/支持工具,该工具始终允许在浏览器中进行匿名访问。
客户想要类似于http://www.livechatinc.com的东西
我已经创建了一个从集线器发送和接收的 javascript 插件,无论它位于哪个域中。 (我的客户有多个站点)拼图的缺失部分是最简单的,管理匿名用户以允许多标签对话。
【问题讨论】:
-
您希望匿名用户能够从任何打开的浏览器选项卡与同一站点(即 site.com)聊天,对吗?
-
@tede24 是的,这就是我想要的。
-
你不能用某种 SessionId (Guid) 设置一个 cookie,为那个 Id 创建一个组并订阅那里的所有 connectionids 吗?这样您就可以将消息广播到所有选项卡
-
这到底是怎么回事?您是否尝试过解决方案或找到其他解决方案?
标签: c# asp.net-mvc-5 signalr