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个不同的账号同时登录),当在线用户数超出阈值时,系统抛出异常,并终止操作。
处理过程:
- 用户登录时将mac+userId信息写入登录日志表。
- 用户重要操作(如查询数据、保存数据)写入接口访问日志表。
- 通过分析登录日志、操作日志获取在线用户数量。
- 加载本地证书文件,如果没有部署则读取服务器证书。
- 当在线用户数量超出软件证书限制的数量,终止用户操作。
- 当前时间>软件到期时间(Expire Time),终止用户操作。
本文主要讲解【数据库直连模式】下的软件用户授权认证,如果采用前后端分离的【WebApi】模式,建议采用在线用户缓存+AOP切面编程拦截接口。大致原理如下:
- 用户登录、登出操作,更新缓存的用户状态。
- AOP拦截接口访问,更新缓存的用户状态。
- 软件认证,校验软件证书是否过期+在线用户数量。
2.2、新建 sys_UserAccessLog 表 - 接口访问记录表
在CSFrameworkV6_System(系统数据库)新建 sys_UserAccessLog 表。
作用:该表用于记录用户的操作,比如查询、保存数据。主要字段:UID+MAC。
SQL脚本
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脚本
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 模型:
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接口
开始登录,检查用户并发数
/// <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方法。
//接口访问日志
this.WriteAccessLog(_Database, MethodBase.GetCurrentMethod().Name, tmpUser.Account, loginUser.MAC);2.5、校验在线用户数
基础资料界面操作
dalBaseDataDic.Update 方法:
public virtual bool Update(MasterDataUpdate<T> data)
{
//验证软件证书,如:在线用户并发数、软件过期
this.AssertLicense(MethodBase.GetCurrentMethod().Name, true);
//省略代码......
}业务单据界面操作
dalXXX.Query方法:
public List<res_PO> Query(QueryPO input)
{
//验证软件证书,如:在线用户并发数、软件过期
this.AssertLicense(MethodBase.GetCurrentMethod().Name, true);
//省略代码......
}dalXXX.Update方法:
public SaveResult Update(BusinessData<tb_PO, tb_POs> data)
{
//验证软件证书,如:在线用户并发数、软件过期
this.AssertLicense(MethodBase.GetCurrentMethod().Name, true);
//省略代码.....
}三、发布证书

参考:CSFramework.Authentication 软件授权认证系统 用户操作手册。
https://www.cscode.net/archive/csframework-authentication/616549699715077.html
四、参考文章
.NET C/S架构软件用户授权设计方案(mac地址+白名单用户)
https://www.cscode.net/archive/newdoc/615796830072837.html


CSFrameworkV6旗舰版开发框架 | 集成软件授权认证系统|C/S开发框架
C/S软件授权注册系统V3.0(Winform+WebApi+.NET8+EFCore版本)|C/S开发框架
CSFramework.Authentication 软件授权证书管理系统|C/S开发框架
C/S客户端软件授权设计方案 | MAC地址白名单+软件到期时间授权|C/S开发框架
CSFramework.Authentication 软件授权证书管理系统|C/S开发框架
CSFrameworkV6旗舰版开发框架 | 集成软件授权认证系统|C/S开发框架
使用DeepSeek生成DevExpress表格、窗体、C#模型代码并集成到开发框架|C/S开发框架
C#统计List 字符串属性长度(返回每个属性的最大长度)|C/S开发框架
详解DevExpress.LookUpEdit控件实现自动搜索定位功能|C/S开发框架
ToolTipController超提示组件显示超提示信息在指定位置|C/S开发框架
FastReport.NET自动文本宽度+自动换行+自动行高|C/S开发框架
C#获取MAC地址包括物理网卡和虚拟网卡|C/S开发框架
CSFramework.EF.PostgreSql数据库组件 PostgreSql数据库测试报告|C/S开发框架
CSFrameworkV6快速开发框架 | 使用PostgreSql 数据库测试报告|C/S开发框架
CSFramework WebApi开发框架集成PostgreSql数据库及测试报告|C/S开发框架
DevExpress LookupEdit按回车键自动确认选择数据|C/S开发框架
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
