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地址+白名单用户)