ServiceStack对事件订阅者的鉴权要求

The requirement for authentication of event subscribers in ServiceStack

我的客户端-服务器应用程序使用 ServerEventsFeature 从服务器向客户端发送命令。 在客户端中,我使用 ServerEventsClient 及其 Start 方法来订阅事件,但首先我使用 ServerEventsClient.ServiceClient 及其 Send 方法将身份验证请求发送到服务器。

如果连接断开,我的客户端也需要不断地连接到服务器。 为此,我使用我的 ServerEventsClient 的 OnException Action 属性,当连接中断时,我在循环中调用 Stop 方法并再次尝试发送身份验证请求,直到服务器响应。

一切正常,但如果我重新启动服务器,在客户端有时间发送身份验证请求之前,我会在服务器上看到订阅事件(OnConnect、OnSubscribe 等),并且在检查属性时的订阅,我得到奇怪的值,如 IsAuthenticated:False,UserId:-2。 然后是身份验证请求,再次有预期的订阅事件,这一次,属性 值已经预期为 IsAuthenticated: True, UserId: 46。 第一种情况下的这个SessionId与断开连接前的值不同,但与认证后的值不匹配。 在 OnConnect 事件处理程序中,我尝试检查 IsAuthenticated 属性 并调用对象 IEventSubscription 的 Unsubscribe 方法,但之后仍然发生 OnSubscribe 事件。 我有 2 个问题:

Q1:很明显ServerEventsClient在断开后自动尝试重连。 在这种情况下,可能未触发 Stop 方法,因为客户端无法执行取消订阅请求,因为服务器不可用。 服务器不可用时如何停止此过程?

Q2:我能否阻止未授权客户端的事件订阅?

服务器事件客户端发送检测信号以确定何时在检测到连接断开后自动尝试重新连接。您可以通过删除返回给客户端的 heartbeatUrl 来停止心跳,例如:

Plugins.Add(new ServerEventsFeature {
    OnConnect = (sub, clientInfo) => clientInfo.Remove("heartbeatUrl")
});

您可以将服务器事件限制为仅允许经过身份验证的用户:

Plugins.Add(new ServerEventsFeature {
    LimitToAuthenticatedUsers = true,
});