Hoo*_*ini 7 asp.net-mvc signalr asp.net-identity signalr-2
我正在使用ASP.NET MVC 5和SignalR.我想向特定用户发送消息.我已经按照本教程中解释的方法(也是本答案的建议).
我已经覆盖IUserIdProvider,UserId用作connectionId.
public class SignalRUserIdProvider : IUserIdProvider
{
public string GetUserId(IRequest request)
{
// use: UserId as connectionId
return Convert.ToString(request.User.Identity.GetUserId<int>());
}
}
Run Code Online (Sandbox Code Playgroud)
我已对我的应用程序进行了更改Startup以使用上述自定义提供程序:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var idProvider = new SignalRUserIdProvider();
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);
ConfigureAuth(app);
app.MapSignalR();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的客户端可以将目标ClientID传递到集线器,集线器只将消息转发给请求的客户端,这是我的集线器:
[Authorize]
public class ChatHub : Hub
{
public void Send(string message, string destClientId)
{
Clients.User(destClientId).messageReceived(Context.User.Identity.Name + " says: " + message);
}
}
Run Code Online (Sandbox Code Playgroud)
这工作得非常好.我的问题是关于安全性,如果这是一个安全网站的正确方法?
根据SignalR Security简介,随机生成的连接ID是SignalR安全的一部分:
服务器不处理来自与用户名不匹配的连接ID的任何请求.恶意用户不太可能猜出有效请求,因为恶意用户必须知道用户名和当前随机生成的连接ID.
上面的方法是用固定的替换随机选择的connectionIdUserId ......上面的代码是否有任何安全问题?
注意:我正在开发一个电子商务网站,用户需要能够接收消息,即使他们处于离线状态(消息将存储在数据库中,一旦在线,他们就可以阅读).
您已经很好地找到了正确的解决方案。唯一的技巧是您的安全设置应确保您无法欺骗其他人的 UserId。
例如,我们与 SignalR 的场景完全相同,但我们使用 JWT 令牌中的 UserId 声明来告诉您是谁。因此,如果您想接收他的消息,您需要知道该人的登录凭据。您不能只更改声明中的 UserId,因为这样 JWT 签名将无效,并且您将不再获得身份验证或授权。
所以TL;DR:使用 JWT 身份验证或带有单向签名的东西,以防止篡改 UserId。
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |