3

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

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

谢谢

4

2 回答 2

2

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

为了防止在同一台计算机上出现多个实例,您可以使用LocalMessageReceiver 类

您可以在此处查看代码示例,该示例向您展示如何阻止用户打开应用程序的第二个实例。每个 LocalMessageReceiver 必须具有唯一的通道名称作为构造函数参数。如果构造函数抛出异常,您可以假设存在应用程序的另一个实例。

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

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

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

于 2012-09-28T14:08:02.057 回答
1

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

userGuid | activeHMAC | lastLoginDate | currentlyLoggedIn (bit)

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

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

于 2012-09-28T14:59:31.617 回答