如何每个用户只允许一个会话

时间:2012-09-28 13:49:37

标签: c# asp.net wcf silverlight

我被分配了一项任务,限制单个用户同时使用silverlight应用程序。理想情况下,每次用户打开新应用程序时,先前的实例都应该收到某种通知并关闭。

Silverlight应用程序使用通过REST端点公开的WCF服务来使用数据。 目前,对服务的每次调用都有用户名和密码作为参数。这很好,因为我们有无国籍的服务。有一些应用程序已经使用这些服务,我正在寻找最不痛苦的解决方案。

由于

2 个答案:

答案 0 :(得分:2)

好的,所以我赶紧回答,因为我误解了这个问题。我最初以为你指的是同一台计算机上的实例。

为防止同一台计算机上的多个实例,您可以使用LocalMessageReceiver Class

您可以看到代码示例here,其中显示了如何阻止用户打开应用程序的第二个实例。每个LocalMessageReceiver都必须具有唯一的通道名称作为构造函数参数。如果构造函数抛出异常,则可以假定存在另一个应用程序实例。

如果您只想保留最后一个应用程序实例并关闭之前的应用程序实例,那么您应该为每个实例创建唯一的通道名称,然后分派消息以告知其他实例关闭。

为了防止不同计算机上的多个应用程序实例我没有资格回答,但首先想到的是每当用户登录时写入数据库。

如果您的服务不一定必须保持无状态,那么您可以在每次用户登录时保留数据库表中的唯一标识符(例如:登录日期?),然后每当用户想要执行某些操作时操作,您可以检查数据库中的最后一个标识符是否与当前会话中的标识符相对应。如果没有,则表示有人从另一台计算机使用同一用户登录,因此您可以使会话过期。

答案 1 :(得分:1)

因为Silverlight本身不是无状态应用程序,所以您应该能够使用简单的服务HMAC来实现它。如果你的数据库中已经有了用户名和/或guid,那么应该是一个简单的补充,让用户的guid键入一个单独的表,其中包含一些时间戳信息和特定登录的特定HMAC。该HMAC将根据机器的特定内容以及生成的时间戳生成。类似的东西:

userGuid | activeHMAC | lastLoginDate | currentlyLoggedIn (bit)

然后,在silverlight控件的登录操作中,可以添加或更新userGuid的记录以包括当前信息。这将强制所有新登录覆盖现有登录HMAC。然后在注销或关闭事件上,只需调用服务并将currentlyLoggedIn位设置为false。

然后,您需要确保此HMAC与所有通信一起发送到Web服务,以便可以针对新呼叫进行验证,或者让每个客户端定期调用服务来比较HMAC并在客户端失败时禁用客户端比较。由于Silverlight以断开连接的方式运行,因此您的选择可能受数据完整性的控制。就个人而言,我认为将HMAC嵌入所有通信中可以更安全,以防止任何延迟时间允许不当行为。