SignalR Authorize 被多次调用

SignalR Authorize is being called multiple times

我正在尝试跟踪连接到我的集线器的用户。 我尝试这样做的方法是为我的集线器创建自定义授权属性,并检查尝试连接的用户。如果用户已经连接,则集线器不会授权连接

public class SingleHubConnectionPerUserAttribute : Microsoft.AspNet.SignalR.AuthorizeAttribute
    {
        private static readonly HashSet<UserKey> connections = new HashSet<UserKey>();

        public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
        {
            Type hubType = hubDescriptor.HubType;
            string userId = request.User.Identity.GetUserId();
            UserKey userKey = new UserKey(hubType, userId);

            if (connections.Contains(userKey) || !base.AuthorizeHubConnection(hubDescriptor, request))
            {
                return false;
            }

            connections.Add(userKey);
            return true;
        }
}

如果每个连接只调用一次 AuthorizeHubConnection 方法,这会很好地工作,但事实并非如此。

当我加载尝试与集线器连接的页面时,AuthorizeHubConnection 奇怪地运行了多次,并且运行的次数并不总是相同,有时是 5 次,有时是 3 次,我真的不知道可能是什么原因造成的。

您知道什么会导致多次调用 AuthorizeHubConnection 吗?

每次 SignalR 服务器在执行任何其他操作之前收到 HTTP 请求时都会调用授权(请参阅:https://github.com/SignalR/SignalR/blob/dev/src/Microsoft.AspNet.SignalR.Core/PersistentConnection.cs#L161)。虽然 SignalR 维护逻辑上持久的连接,但它会在幕后发出多个 HTTP 请求。当使用 Websockets 传输时,您通常会在启动连接时看到其中的 3 个(用于协商、连接和启动请求),并且每次重新连接时一个。 longPolling 和 serverSentEvents transport 每次都创建一个 HTTP 请求来发送数据(send)。另外 longPolling 创建一个轮询 HTTP 请求来接收数据 (poll)。这些请求中的每一个都必须经过授权,因此这就是为什么您会看到多次调用 AuthorizeHubConnection 方法的原因。