记录用户登录以报告客户端超过许可证数量

我是商业Windows应用程序(c#)的首席开发人员。 新要求是跟踪滥用许可证的客户。

例如:假设客户购买了10个用户许可协议,即在任何给定时间内同时使用10个用户。

我需要能够报告,回顾历史,客户有超过10个用户同时登录的所有时间。

我已经有一个包含列的User表:userid(主键),pw,lastLogin,lastLogout。

我正在考虑创建一个新的“日志记录”表,每次用户注销时都会添加一个新行…列可能包括:

LogId,UserId,LoginDateTime,LogoutDateTime

…然后我会有一个用户每次登录/退出应用程序的历史…

但是我不确定这个表格设计是否会为报告提供有效的计算…我是否使用SQL或c#来执行计算对我来说无关紧要,只要它相当快……

希望有人可能对如何更好地设计此表有一个好主意,以便我可以快速计算客户超出许可限制时的任何/所有时间点。

注意:我不想阻止11t,12th等用户使用该应用程序……要求是向用户显示警告消息,但允许他继续工作……

将开始和结束会话视为需要记录的事件。 您创建一个表来记录这些事件。

因此,一个开始和结束的会话将在表中有两个条目 – 一个用于会话开始,一个用于会话结束。 您只需向表中添加记录,从不修改以前的记录。 该表可以非常简单地通过向记录添加“会话计数”字段来跟踪打开会话的数量,该字段在会话开始事件发生时从先前记录的会话计数值递增并且在会话结束事件发生时递减。

“会话计数”列现在为我们提供了并发会话数随时间变化的分段连续函数。

示例数据:

SessionId EventType .... your session data here ... SessionCount 1. 1 Login ................ 1 2. 2 Login ................ 2 3. 3 Login ................ 3 4. 1 Logout ................ 2 5. 4 Login ................ 3 6. 4 Logout ................ 2 7. 2 Logout ................ 1 8. 3 Logout ................ 0 9. 5 Login ................ 1 10. 6 Login ................ 2 

需要担心的事情:

  1. 您必须确保配对开始/结束事件,因此如果发生任何故障,仍必须生成会话结束事件。
  2. 你需要桌子防篡改吗? 如果是这样,我也有一种技术。

编辑:请注意,我把“你的会话数据放在这里”,我的意思是“你的会话事件数据在这里”。 时间戳等信息会在此处输入。 应使用另一个表来跟踪两个事件共有的会话信息,例如拥有会话的用户的身份(对两个表使用相同的SessionId密钥)。

另一种选择是创建用户会话表。 用户登录时,将其会话插入表中。 当他们注销时,删除它。 这样,您总能找到有多少用户连接的简单方法。

然后你可以在插入(也许删除)上创建一个触发器,你可以根据会话计数从那里登录。 如果您同时记录删除,则可以了解他们使用过多用户的时间长度。

还要记住,您必须适当地清理孤立的连接。

我会谨慎地通过这种方式实现许可证检查,因为(正如Daniel的回答中所述 ,如果您的应用程序崩溃,或者即使用户以特定方式退出它,您也不会获得注销事件(End Process from任务管理器,ALT + F4,而不是通过文件|退出等)。

因此,当用户使用该应用程序时,您可以想象有越来越多的死会话。 您不仅可以获得有关您的用户的错误数据和印象,更重要的是,他们会因收到不应得的警告信息而感到沮丧。 如果你试图告诉他们,他们实际上没有违反许可证,他们可能会变得非常冒犯。 失去客户的好方法。

我想说一个合理的许可证检查方案需要中央服务器以外的客户控制,并且客户可以访问Internet。 它可能是这样的:

  1. 在启动应用程序时,程序通知新会话的许可证服务器;
  2. 在应用程序工作期间,程序定期(比如1x 5分钟左右)向许可证服务器发送一个状态信号;
  3. 在正常退出程序时,它将会话结束信号发送给许可证服务器;
  4. 如果在程序的10分钟内没有收到状态信号,则认为会话终端被许可服务器终止。

注意:这是以前处理过的问题。 我见过的最好的选择是由未登记的用户维护MRU堆栈的用户活动(在这种情况下为深度10),并从数据库事务活动派生 – SELECT TOP 10 DISTINCT usercode FROM atable WHERE(最近的事务类型不是’t’注销“)ORDER BY timestamp DESC。 只要有人访问不属于最新10的系统,您就有两种选择。 你允许他们登录,并将最旧的登出状态(这会造成麻烦,但让他们继续工作); 或者让他们等到前十名之一明确注销。 有时用户可以做出选择。 有时需要管理员。 但这是政策上的区别。

然后,您每次登录时都会对它们进行计费(使用第一个方案),或者您只是强制执行限制(使用第二个方案)。

我建议使用手机短信function,例如提醒您或通过网络方式记录,以便您可以跟踪谁在做什么……但只有当他们超出限制时。 (研究WCF有几种方法可以做到这一点)

这样你就可以跟踪他们的使用情况。 对真实数据进行额外收费或重新谈判合同变得有意义。 如果你擅长客户服务,那么这不应该惹恼他们的羽毛,特别是如果你指出你需要一个基础设施来为一个精心设计的用户群提供服务。 据推测,你对他们的许可方案也很清楚……

具有(LogId,UserId,LoginDateTime,LogoutDateTime)的表结构的问题在于它变得难以聚合 – 查询以查看在指定时间使用系统的每个人都很容易,但是始终获得用户数很难。

一种可能的方法是对数据进行非规范化处理 – 并记录使用单位,而不是跨度。 您可以使用表结构(UserId,BlockDateTime)跟踪30分钟块中的使用情况。

如果BettyR从上午10:05到上午11:45使用该系统,请在表格中创建四条记录:

 BettyR, 10:00am BettyR, 10:30am BettyR, 11:00am BettyR, 11:30am 

然后,您可以使用带有group by子句的普通SQL查询来查找在每半小时内使用系统的不同用户的数量。

 select ... from UsageBlocks group by BlockDateTime having count(*) > 10 

根据您的要求,您可以使用报告应用程序对这些特定时间段进行更深入的分析。