# Api-NetCore-Demo **Repository Path**: xiaofeim/api-net-core-demo ## Basic Information - **Project Name**: Api-NetCore-Demo - **Description**: Api接口,标准模板,集成codeFirst,实现API接口权限控制。整个激活系统围绕 :硬件标识采集 → 产品密钥生成 → 激活验证 → 持续校验」 四个阶段运转,结合 ActivationController 的接口 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-20 - **Last Updated**: 2025-07-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Api-NetCore-Demo #### 介绍 Api接口,标准模板,集成codeFirst,实现API接口权限控制。整个激活系统围绕 :硬件标识采集 → 产品密钥生成 → 激活验证 → 持续校验」 四个阶段运转,结合 ActivationController 的接口 #### 软件架构 整体架构说明: ![输入图片说明](Api_Core_Spider/image.png) 二、分步操作流程(结合代码 + 流程图) 1. 硬件信息采集(基础标识生成) 目的:获取设备唯一硬件指纹(MachineCode),作为权限控制的核心依据。 代码关联:MachineInfo.cs + IMachineCodeGenerator 操作逻辑: 客户端 / 设备调用 ActivationController.GetMachineCode(GET /api/activation/machinecode)。 IMachineCodeGenerator 采集硬件信息(CPU、硬盘、网卡等),生成 MachineInfo 对象: ``` public MachineInfo GetMachineInfo() { return new MachineInfo { MachineCode = HashHardwareInfo(), // 如:SHA256(CPU+硬盘+网卡信息) CpuInfo = GetCpuInfo(), DiskInfo = GetDiskInfo(), // ...其他硬件字段 }; } ``` 服务端返回 MachineInfo 给客户端,客户端保存 MachineCode(后续激活、权限校验必传)。 2. 产品密钥生成(授权凭证准备) 目的:生成可分发的产品密钥(ProductKey),作为激活权限的 “门票”。 代码关联:ActivationController.GenerateProductKey + IActivationService 操作逻辑(管理员 / 管理端执行): 调用 POST /api/activation/generatekey 接口,传入 productId(产品标识)、userId(用户标识)、days(有效期天数)。 IActivationService.GenerateProductKey 生成唯一密钥(如 ABCD-1234-EFGH-5678),并记录到数据库(ProductKey 表,IsUsed = false)。 管理员将 ProductKey 分发给用户(如邮件、后台系统)。 3. 设备激活绑定(权限初始化) 目的:将 ProductKey 与 MachineCode 绑定,标记设备为 “已授权”。 代码关联:ActivationController.Activate + IActivationService.Activate 操作逻辑(用户 / 设备执行): ``` { "ProductKey": "ABCD-1234-EFGH-5678", // 管理员分发的密钥 "MachineInfo": { /* 步骤1采集的硬件信息 */ }, "UserName": "User001", // 可选:用户信息 "Email": "user@example.com" } ``` IActivationService.Activate 执行校验与绑定: 校验 ProductKey:查询 ProductKey 表,检查密钥存在、IsUsed = false、有效期合法。 校验 MachineCode:查询 Activation 表,检查 MachineCode 未被激活(防止重复绑定)。 绑定激活:标记 ProductKey.IsUsed = true,创建 Activation 记录(关联 MachineCode、ProductKey、激活时间、有效期)。 激活成功后,服务端返回 ActivationCode(如 XYZ-9876)或令牌(JWT),客户端保存激活凭证。 4. 权限校验拦截(访问控制核心) 目的:拦截 API / 功能调用,校验设备是否已激活且权限有效。 代码关联:中间件 / 过滤器 + IActivationService.Validate 操作逻辑(服务端执行): 全局拦截:通过中间件(如 ActivationMiddleware)拦截所有请求,提取 MachineCode(从请求头 / 体中获取)。 ``` public async Task InvokeAsync(HttpContext context) { string machineCode = ExtractMachineCode(context); bool isActivated = await _activationService.IsActivated(machineCode); if (!isActivated) { context.Response.StatusCode = 403; // 未授权 return; } await _next(context); } ``` 2、细粒度控制:通过授权策略(如 [Authorize(Policy = "ActivatedDevice")]),结合 MachineCode 校验激活状态: ``` public class ActivatedDeviceHandler : AuthorizationHandler { protected override async Task HandleRequirementAsync(...) { string machineCode = context.User.FindFirstValue("MachineCode"); bool isActivated = await _activationService.IsActivated(machineCode); if (isActivated) context.Succeed(requirement); } } ``` 5. 功能访问控制(业务逻辑执行) 目的:确保只有通过权限校验的设备,才能访问受保护功能 / API。 代码关联:[Authorize] 特性 + 业务控制器 操作逻辑(客户端 + 服务端): 客户端访问受保护功能(如 GET /api/user/profile)时,携带 MachineCode 或激活凭证(如 JWT)。 服务端通过中间件 / 授权策略校验权限,通过则执行业务逻辑,返回结果;未通过则返回 403 Forbidden。 6. 异常处理与维护(权限问题排查) 常见异常: 密钥无效:检查 ProductKey 是否正确、是否已被使用(联系管理员重置)。 机器码不匹配:硬件变更导致 MachineCode 变化,需重新激活(或允许硬件变更校验)。 激活过期:联系管理员续期,或重新生成 ProductKey 激活。 维护操作: 管理员可通过后台系统,查询 / 重置 ProductKey 状态、Activation 记录,处理权限问题。 三、关键代码模块映射 流程阶段 核心代码文件 / 接口 作用说明 硬件信息采集 MachineInfo.cs + IMachineCodeGenerator 生成设备唯一 MachineCode 产品密钥生成 ActivationController.GenerateProductKey 生成 / 分发 ProductKey 设备激活绑定 ActivationController.Activate + IActivationService.Activate 绑定 ProductKey 与 MachineCode 权限校验拦截 ActivationMiddleware + 授权策略 拦截请求,校验激活状态 功能访问控制 [Authorize] 特性 + 业务控制器 控制受保护功能 / API 的访问 异常处理 全局异常中间件 + 管理员后台 处理权限校验失败、密钥过期等问题 四、实际使用场景示例(软件激活) 管理员操作: 生成 ProductKey: ABCD-1234-EFGH-5678(有效期 30 天),发给用户。 用户操作: 打开软件 → 自动调用 machinecode 接口,获取 MachineCode: HW-123456。 输入 ProductKey → 调用 activate 接口激活 → 服务端绑定 MachineCode 与 ProductKey,返回激活码。 软件保存激活凭证 → 后续每次启动 / 调用功能时,自动携带 MachineCode 校验权限 → 校验通过则正常使用。 #### 安装教程 1. add-migration init初始化数据库 2. 通过读取设备信息、注册、激活过程实现注册码认证授权 3. 针对需要的接口设置限制 #### 使用说明 1. xxxx ![输入图片说明](image.png) **2. 注册激活流程** **2.1 获取机器码** 客户端调用 GET /api/activation/machinecode 接口 系统收集硬件信息(如 CPU、硬盘等)生成唯一机器码 返回包含机器码的机器信息对象 **2.2 获取产品密钥** 用户需要通过官方渠道购买软件授权 提供机器码给授权方(如在线表单、客服等) 授权方使用管理接口 POST /api/activation/generatekey 生成产品密钥 需传入参数:productId(产品 ID)、userId(用户 ID)、days(有效期天数) 授权方将生成的产品密钥提供给用户 **2.3 激活软件** 客户端调用 POST /api/activation/activate 接口 传入包含机器码和产品密钥的激活请求 服务器验证产品密钥有效性和匹配性 如果验证通过,返回激活成功响应,包含授权信息 如果失败,返回错误信息 **2.4 验证激活状态** 客户端定期(或每次启动时)调用 POST /api/activation/validate 接口 传入包含机器码和授权信息的验证请求 服务器验证授权状态是否有效 返回验证结果(有效 / 无效) #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)