【问题标题】:How to allow only one session per user如何只允许每个用户进行一个会话
【发布时间】:2012-09-28 13:49:37
【问题描述】:

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

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

谢谢

【问题讨论】:

  • “拥有无状态服务”似乎与知道用户拥有多少会话不一致。

标签: c# asp.net wcf silverlight


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 如果在不同的计算机上启动新会话会怎样?
  • 嗯..你是对的,谢谢。我会考虑并更新答案
  • 感谢@sssilviu,我不会强迫这些服务保持无状态。我还可以为 sl 客户端添加新服务,或者以某种方式调整托管应用程序以关闭多个客户端。任何想法都可能有用。感谢您的努力。
  • @v00d00,我更新了我的答案,考虑到您不需要服务是无状态的。
【解决方案2】:

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

userGuid | activeHMAC | lastLoginDate | currentlyLoggedIn (bit)

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

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

【讨论】:

    猜你喜欢
    • 2012-06-02
    • 1970-01-01
    • 2013-11-10
    • 2014-10-11
    • 2015-03-12
    • 2015-11-03
    • 1970-01-01
    • 2019-10-19
    • 2020-03-01
    相关资源
    最近更新 更多