gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:34:43 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com