C/S客户端软件授权设计方案 | 在线用户并发数+软件到期时间授权|C/S开发框架
作者:csframework|C/S框架网  发布日期:2024/11/30 12:42:49

C/S客户端软件授权设计方案 | 在线用户并发数+软件到期时间授权|C/S开发框架

C/S客户端软件授权设计方案 - 在线用户并发数+软件到期时间授权

一、设计目的

我们的客户开发了ERP或MES系统,需要通过【在线用户并发数量】以及【软件到期时间】控制客户端软件运行。

控制逻辑:

  • 当在线用户数量超出软件证书限制的用户数量,终止用户操作。
  • 当前时间>软件到期时间(Expire Time),终止用户操作。

1.1、在线用户并发数量

在线用户并发数量是指同时访问系统的用户数量。用户登录系统时将客户端mac地址以及账号存储在登录日志表。

用户登录或操作数据时判断在线用户数量。

1.2、软件到期时间(Expire Time)

证书定义软件的使用到期时间。用户登录或操作数据时校验软件到期时间。

1.2、开发环境

  • VS2022,C#,.NET8,EFCore
  • SqlServer 2012(阿里云ECS服务器)
  • Windows 10
  • 开发框架:CSFrameworkV6.1(2024版)

二、设计方案

2.1、基本原理

用户端以mac地址+userId作为唯一标识,假设系统限制mac地址数据=2(最多支持2台电脑或2个不同的账号同时登录),当在线用户数超出阈值时,系统抛出异常,并终止操作。

处理过程:

  1. 用户登录时将mac+userId信息写入登录日志表。
  2. 用户重要操作(如查询数据、保存数据)写入接口访问日志表。
  3. 通过分析登录日志、操作日志获取在线用户数量。
  4. 加载本地证书文件,如果没有部署则读取服务器证书。
  5. 当在线用户数量超出软件证书限制的数量,终止用户操作。
  6. 当前时间>软件到期时间(Expire Time),终止用户操作。

本文主要讲解【数据库直连模式】下的软件用户授权认证,如果采用前后端分离的【WebApi】模式,建议采用在线用户缓存+AOP切面编程拦截接口。大致原理如下:

  • 用户登录、登出操作,更新缓存的用户状态。
  • AOP拦截接口访问,更新缓存的用户状态。
  • 软件认证,校验软件证书是否过期+在线用户数量。

2.2、新建 sys_UserAccessLog 表 - 接口访问记录表

在CSFrameworkV6_System(系统数据库)新建 sys_UserAccessLog 表。

作用:该表用于记录用户的操作,比如查询、保存数据。主要字段:UID+MAC。

SQL脚本

C# 全选
CREATE TABLE [dbo].[sys_UserAccessLog]
(
	[isid] [varchar](50) NOT NULL,
	[UID] [varchar](50) NULL,
	[AccessTime] [datetime] NULL,
	[MethodName] [varchar](50) NULL,
	[MAC] [varchar](50) NULL,
	[AccessType] [varchar](20) NULL
)

字段说明

  • isid:主键,雪花id
  • UID:用户账号
  • AccessTime:操作时间
  • MethodName:方法名,如:Query、Save
  • MAC:mac地址
  • AccessType:访问类型,默认 Normal

2.3、新建 sys_UserLicenseOnlineConcurrency 表 - 并发用户配置表

在CSFrameworkV6_System(系统数据库)新建 sys_UserLicenseOnlineConcurrency 表。

作用:客户端软件授权证书配置表,包括在线用户并发参数配置及MAC地址、软件过期日期等信息。

SQL脚本

C# 全选
CREATE TABLE [dbo].[sys_UserLicenseOnlineConcurrency]
(
	[isid] [varchar](50) NOT NULL,
	[SystemCode] [varchar](50) NULL,
	[CustomerCode] [varchar](50) NULL,
	[CustomerName] [nvarchar](150) NULL,
	[InstallTime] [datetime] NULL,
	[LastRegisteTime] [datetime] NULL,
	[Description] [nvarchar](250) NULL,
	[LicenseData] [varchar](8000) NULL,
	[FlagValueEncrypt] [bit] NULL,
	[FlagUse] [bit] NULL
)

字段说明

  • isid:主键,证书编号。
  • SystemCode:系统编码,如:ERP/MES/CSFrameworkV6。
  • CustomerCode:软件客户编码。
  • CustomerName:软件客户名称。
  • InstallTime:首次安装软件时间。
  • LastRegisteTime:最后一次注册软件时间。
  • Description:备注信息。
  • LicenseData:证书重要参数配置(加密字符串)。
  • FlagValueEncrypt:证书信息是否加密,默认为加密。
  • FlagUse:启用证书。

LicenseData - 证书参数配置 (对应 UserLicenseParams 模型)

证书重要参数配置(加密字符串)。

系统将 UserLicenseParams 实例转换为json字符串,然后加密。

UserLicenseParams 模型:

C# 全选
public class UserLicenseParams
{
    /// <summary>
    /// 软件到期时间
    /// </summary>
    public DateTime? ExpireTime { get; set; }

    /// <summary>
    /// 在线用户许可数量
    /// </summary>
    public int? LicenseNumber { get; set; }

    /// <summary>
    /// 小时数,用于判断活跃用户
    /// </summary>
    public int? HoursRangeActiveUsers { get; set; }

    /// <summary>
    /// 小时数,用于判断闲置用户
    /// </summary>
    public float? HoursRangeLeave { get; set; }

    /// <summary>
    /// 软件供应商
    /// </summary>
    public string Vendor { get; set; }

    /// <summary>
    /// 注册码
    /// </summary>
    public string RegisterNo { get; set; }

    /// <summary>
    /// 授权类型(OnlineUser/ExpireTime)
    /// </summary>
    public string ValidationType { get; set; }
}

2.4、dalUser.Login接口

开始登录,检查用户并发数

C# 全选
        /// <summary>
        /// 用户登录
        /// </summary>
        /// <param name="loginUser">登录信息</param>
        /// <returns></returns>
        public Core.LoginUser Login(CSFrameworkV6.Core.LoginUser loginUser)
        {
            //验证软件证书,如:在线用户并发数、软件过期
            this.AssertLicense(MethodBase.GetCurrentMethod().Name, true, true, loginUser.Account, loginUser.MAC);

            //省略代码......
        }

登录成功,添加接口访问日志

参考:dalUser.cs 的Login方法。

C# 全选
//接口访问日志
this.WriteAccessLog(_Database, MethodBase.GetCurrentMethod().Name, tmpUser.Account, loginUser.MAC);

2.5、校验在线用户数

基础资料界面操作

dalBaseDataDic.Update 方法:

C# 全选
        public virtual bool Update(MasterDataUpdate<T> data)
        { 
            //验证软件证书,如:在线用户并发数、软件过期
            this.AssertLicense(MethodBase.GetCurrentMethod().Name, true);
            //省略代码......
        }

业务单据界面操作

dalXXX.Query方法:

C# 全选
        public List<res_PO> Query(QueryPO input)
        {
            //验证软件证书,如:在线用户并发数、软件过期
            this.AssertLicense(MethodBase.GetCurrentMethod().Name, true);
            //省略代码......
        }

dalXXX.Update方法:

C# 全选
        public SaveResult Update(BusinessData<tb_PO, tb_POs> data)
        {
            //验证软件证书,如:在线用户并发数、软件过期
            this.AssertLicense(MethodBase.GetCurrentMethod().Name, true);
            //省略代码.....
        }

三、发布证书

C/S客户端软件授权设计方案 | 在线用户并发数+软件到期时间授权|C/S开发框架

参考:CSFramework.Authentication 软件授权认证系统 用户操作手册。

https://www.cscode.net/archive/csframework-authentication/616549699715077.html

四、参考文章

.NET C/S架构软件用户授权设计方案(mac地址+白名单用户)

https://www.cscode.net/archive/newdoc/615796830072837.html

C/S客户端软件授权设计方案 | 在线用户并发数+软件到期时间授权|C/S开发框架

C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务
上一篇 下一篇