ServiceStack中对事件订阅者进行身份验证的要求

时间:2015-07-16 22:47:00

标签: 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事件。 我有两个问题:

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

Q2:我可以阻止事件订阅不是授权客户吗?

1 个答案:

答案 0 :(得分:4)

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

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

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

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