如何从 [Authorize()] 访问 SignalR Hub 参数?

How to access the SignalR Hub arguments from [Authorize()]?

我正在为聊天应用程序制作一个信号器中心(这不是真的,但让我们假装它是)。 我设置了我的授权,以便用户可以被房间的创建者邀请到房间。所以有一个 table 存储谁拥有什么,以及谁被授予访问权限。

这很好。接下来的步骤是添加声明,这样我就不必检查每个请求的访问权限。当用户尝试加入聊天室、添加他们的声明并将他们发送到启动信号器连接的页面时,我会检查一次。

现在我想在我的集线器上使用 [authorize] 装饰器,而不是扔样板

user.Claims.Any(x=> x.ClaimType == $"CanJoinRoom_{RoomId}");

无处不在。

我已经阅读了如何在此处进行基于自定义策略的授权: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies#security-authorization-policies-based

除了一个:指定房间 ID 的实际参数外,我拥有所有需要的部分。我已经能够从

破解一些东西
[MyCustomAuthorizeMethod(this.Context.Request.Form["data"])]

但这看起来有点难看,为了让它工作我必须序列化这个 json

{"H":"myhubname","M":"Initialize","A":[39],"I":0}

这看起来真的很老套。我更愿意将 RoomId 作为参数传递。 它只是一行,但似乎是一个世界。有没有一种优雅的方法可以做到这一点?

如果您想授权调用给定的方法,您可以将 AuthorizeAttribute on the hub method. You may also find this post 放在 hub 授权和身份验证上很有帮助。

这是不可能的,因为属性是在编译时计算的,因此不能有变量。感谢 Pawel 指出这一点。 https://whosebug.com/users/1168070/pawel