假设我在 ASP.NET 后端中有这个 Hub。
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
=> await Clients.All.SendAsync("ReceiveMessage", user, message);
}
我知道我可以像这样用属性 Authorize 保护这个 SendMessage
方法。
public class ChatHub : Hub
{
[Authorize]
public async Task SendMessage(string user, string message)
=> await Clients.All.SendAsync("ReceiveMessage", user, message);
}
这样只有授权用户才能调用此端点。
但仍然能够连接到 ChatHub 并收听 “ReceiveMessage”
。
在 Angular 前端应用程序中,我使用来自 '@microsoft/signalr'
的 signalR.HubConnection
来监听这样的事件。
this.hubConnection.on('ReceiveMessage', (data: SomeData) => {
this.SomeDataSub.next(data);
});
我的问题是,如何确保用户只能收听允许他们收听的点?
因此,如果有人收听 "ReceiveMessage"
,他们将得到:“不允许您收听此事件。”
最佳答案
我不知道有什么方法可以阻止客户监听任何事件(我并不是说这是不可能的)。我只想建议一种可能有所帮助的不同方法。您可以根据用户的 Angular 色将用户添加到组中。然后将敏感事件发送到相应的组。
public class ChatHub : Hub
{
[Authorize]
public async Task SendMessage(string user, string message)
{
// protected event that only users with "admin" role should receive
await Clients.Group("administrators").SendAsync("ReceiveMessage", user, message);
}
public override async Task OnConnectedAsync()
{
var connectionId = Context.ConnectionId;
if (Context.User.IsInRole("admin"))
{
await Groups.AddToGroupAsync(connectionId, "administrators");
}
await base.OnConnectedAsync();
}
public override async Task OnDisconnectedAsync(Exception exception)
{
var connectionId = Context.ConnectionId;
if (Context.User.IsInRole("admin"))
{
await Groups.RemoveFromGroupAsync(connectionId, "administrators");
}
await base.OnDisconnectedAsync(exception);
}
}
关于c# - 如何保护在 SignalR 中监听的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73634286/