我正在使用 ASP.NET MVC 5 和 SignalR。我想向特定用户发送消息。我遵循了中解释的方法本教程 https://learn.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections#iuserid-provider(也由这个答案 https://stackoverflow.com/questions/19522103/signalr-sending-a-message-to-a-specific-user-using-iuseridprovider-new-2-0/21355406#21355406).
我已经覆盖了IUserIdProvider
, 使用UserId
as 连接ID.
public class SignalRUserIdProvider : IUserIdProvider
{
public string GetUserId(IRequest request)
{
// use: UserId as connectionId
return Convert.ToString(request.User.Identity.GetUserId<int>());
}
}
我已经对我的应用程序进行了更改Startup
使用上面的自定义提供程序:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var idProvider = new SignalRUserIdProvider();
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);
ConfigureAuth(app);
app.MapSignalR();
}
}
现在我的客户可以传递目的地ClientID到集线器,集线器只会将消息转发给请求的客户端,这是我的集线器:
[Authorize]
public class ChatHub : Hub
{
public void Send(string message, string destClientId)
{
Clients.User(destClientId).messageReceived(Context.User.Identity.Name + " says: " + message);
}
}
这工作得很好。我的问题是关于安全性的,这是否是安全网站的正确方法?
根据SignalR 安全性简介 https://learn.microsoft.com/en-us/aspnet/signalr/overview/security/introduction-to-security,随机生成的连接 ID 是 SignalR 安全性的一部分:
服务器不会处理来自连接 ID 的任何请求
与用户名不匹配。恶意用户不太可能猜出
有效的请求,因为恶意用户必须知道该用户
name 和当前随机生成的连接 id。
上述方法是替换随机选择的连接ID具有固定的UserId
...上面的代码有安全问题吗?
Note:我正在开发一个电子商务网站,用户需要能够接收消息,即使他们是offline(消息将存储在数据库中,一旦在线即可读取)。