c# - 如何保护在 SignalR 中监听的事件?

标签 c# angular asp.net-core signalr asp.net-core-signalr

假设我在 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/

相关文章:

angular - 响应式表单正确地将表单值转换为模型对象

node.js - 使用 npm 安装 Angular CLI 时出现错误

javascript - 如何在 Jquery 中创建动态下拉列表循环?

c# - C to C# CRC计算转换器

c# - 将从接口(interface)类型获得的 MethodInfo 对象转换为 C# 中实现类型的相应 MethodInfo 对象?

c# - emgucv:C#中的Pan Card不当偏斜检测

c# - 为什么 ModelState.IsValid 总是返回 true?

c# - NHibernate 关系存在双向获取数据的问题

angular - 如何在angular2中触发表单验证器?

c# - `[FromQuery]` IEnumerable<SomeObject> 在 ASP.NET Core 3.1 中解析?