@microi.net/cli 5.5.9 → 5.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +5 -5
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +99 -99
- package/scripts/microi-cli.js +39 -36
- package/scripts/microi-skills.meta.json +341 -338
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +3566 -3566
- package/skills/README.md +4 -4
- package/skills/ai-engine/SKILL.md +45 -45
- package/skills/ai-platform-governance/SKILL.md +177 -177
- package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
- package/skills/app-store/SKILL.md +21 -4
- package/skills/business-blueprint/SKILL.md +85 -85
- package/skills/datasource-engine/SKILL.md +91 -91
- package/skills/dos-orm/SKILL.md +15 -0
- package/skills/dos-orm/references/api-reference.md +229 -229
- package/skills/email-engine/SKILL.md +80 -80
- package/skills/email-engine/references/v8-email.md +34 -34
- package/skills/job-engine/SKILL.md +154 -154
- package/skills/message-notification/SKILL.md +27 -1
- package/skills/message-notification/agents/openai.yaml +5 -5
- package/skills/message-notification/references/contracts.md +102 -102
- package/skills/microi-ai-app-auth.js +652 -652
- package/skills/microi-ai-application/SKILL.md +102 -102
- package/skills/microi-ai-application/agents/openai.yaml +4 -4
- package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
- package/skills/microi-client-frontend/SKILL.md +47 -41
- package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +4 -4
- package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +30 -30
- package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +58 -58
- package/skills/microi-codex/SKILL.md +2 -0
- package/skills/microi-codex-installer/SKILL.md +216 -216
- package/skills/microi-codex-installer/agents/openai.yaml +7 -7
- package/skills/microi-datasource-mapping/SKILL.md +67 -67
- package/skills/microi-db-schema/SKILL.md +6 -6
- package/skills/microi-db-schema/references/core-tables.md +18 -18
- package/skills/microi-db-schema/references/form-component-options.md +256 -256
- package/skills/microi-db-schema/references/schema-overview.md +11 -11
- package/skills/microi-db-schema/references/schema.md +46 -46
- package/skills/microi-db-schema/references/table-catalog.md +57 -57
- package/skills/microi-deployment/SKILL.md +18 -1
- package/skills/microi-deployment/references/deployment-matrix.md +101 -101
- package/skills/microi-docs-coverage/SKILL.md +10 -0
- package/skills/microi-docs-coverage/references/capability-map.md +3 -2
- package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
- package/skills/microi-form-engine/SKILL.md +27 -3
- package/skills/microi-form-engine/references/component-catalog.md +218 -218
- package/skills/microi-form-engine/references/data-source-events.md +124 -124
- package/skills/microi-form-layout/SKILL.md +13 -13
- package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
- package/skills/microi-frontend-sdk/SKILL.md +4 -4
- package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +175 -175
- package/skills/microi-left-right-layout/SKILL.md +141 -141
- package/skills/microi-microservice/SKILL.md +2 -1
- package/skills/microi-microservice/references/runtime-delivery.md +278 -278
- package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +213 -213
- package/skills/microi-solution-quotation/SKILL.md +78 -78
- package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
- package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
- package/skills/microi-sso/SKILL.md +6 -0
- package/skills/microi-sso/references/acceptance.md +49 -49
- package/skills/microi-sso/references/configuration-and-security.md +53 -53
- package/skills/microi-sso/references/inbound.md +53 -53
- package/skills/microi-sso/references/outbound.md +39 -39
- package/skills/microi-system-delivery/SKILL.md +5 -4
- package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +7 -2
- package/skills/microi-ui/SKILL.md +7 -2
- package/skills/microi-uniapp-frontend/SKILL.md +134 -134
- package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +136 -136
- package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +124 -124
- package/skills/module-engine/SKILL.md +30 -14
- package/skills/ocr-engine/SKILL.md +2 -2
- package/skills/ocr-engine/agents/openai.yaml +1 -1
- package/skills/page-engine/SKILL.md +28 -28
- package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +126 -126
- package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +42 -42
- package/skills/performance-testing/SKILL.md +120 -120
- package/skills/playwright-e2e/SKILL.md +84 -84
- package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +68 -68
- package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +64 -64
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +20 -20
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -69
- package/skills/print-engine/SKILL.md +11 -3
- package/skills/production-readonly-audit/SKILL.md +41 -41
- package/skills/report-engine/SKILL.md +71 -71
- package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
- package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
- package/skills/scripts/sync-embedded-skills.mjs +46 -0
- package/skills/scripts/validate-progressive-disclosure.mjs +8 -3
- package/skills/search-engine/SKILL.md +75 -75
- package/skills/spider-engine/SKILL.md +190 -190
- package/skills/system-observability/SKILL.md +169 -157
- package/skills/system-observability/references/memory-incident-triage.md +73 -73
- package/skills/translate-engine/SKILL.md +1 -1
- package/skills/ui-design/SKILL.md +3 -1
- package/skills/uniapp-mall-assets/SKILL.md +170 -170
- package/skills/unity-integration/SKILL.md +155 -155
- package/skills/unity-integration/agents/openai.yaml +4 -4
- package/skills/unity-integration/references/ai-app-delivery.md +103 -103
- package/skills/unity-integration/references/sdk-api.md +82 -82
- package/skills/unity-integration/references/toolbox-migration.md +66 -66
- package/skills/unity-integration/references/webgl-hosting.md +57 -57
- package/skills/v8-api-config/SKILL.md +4 -0
- package/skills/v8-cache-pattern/SKILL.md +306 -306
- package/skills/v8-crud-api/SKILL.md +29 -29
- package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +56 -56
- package/skills/v8-debugging/SKILL.md +143 -143
- package/skills/v8-explorer-tree/SKILL.md +64 -64
- package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +201 -201
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +118 -118
- package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +32 -32
- package/skills/v8-file-upload/SKILL.md +5 -2
- package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +2 -2
- package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +138 -138
- package/skills/v8-formengine-http/SKILL.md +126 -108
- package/skills/v8-frontend-events/SKILL.md +22 -22
- package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
- package/skills/v8-frontend-events/references/bluetooth-print.md +247 -247
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +50 -50
- package/skills/v8-http-integration/SKILL.md +106 -106
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +31 -31
- package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +5 -5
- package/skills/v8-image-processing/SKILL.md +190 -190
- package/skills/v8-image-processing/agents/openai.yaml +4 -4
- package/skills/v8-image-processing/references/api-reference.md +623 -623
- package/skills/v8-menu-buttons/SKILL.md +103 -103
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +145 -145
- package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +228 -228
- package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +43 -43
- package/skills/v8-mongodb/SKILL.md +65 -65
- package/skills/v8-mq-mqtt/SKILL.md +175 -175
- package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
- package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +137 -137
- package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
- package/skills/v8-saas-multi-tenant/SKILL.md +223 -223
- package/skills/v8-security/SKILL.md +1 -1
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +122 -122
- package/skills/v8-sql-query/SKILL.md +7 -5
- package/skills/v8-table-event/SKILL.md +9 -2
- package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +1 -1
- package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +15 -15
- package/skills/v8-tcp-integration/SKILL.md +1 -1
- package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
- package/skills/v8-template-engine/SKILL.md +59 -59
- package/skills/v8-utilities/SKILL.md +92 -92
- package/skills/v8-utilities/references/client-api-index.md +143 -143
- package/skills/v8-utilities/references/platform-http-routes.md +83 -83
- package/skills/v8-utilities/references/server-api-index.md +74 -74
- package/skills/v8-workflow/SKILL.md +13 -4
- package/skills/vision-engine/SKILL.md +19 -19
- package/skills/vision-engine/references/architecture-and-acceptance.md +34 -34
- package/skills/workspace-conventions/SKILL.md +35 -12
- package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +2 -2
- package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +179 -179
- package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +21 -21
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
# 验收、商城发布与交付结论
|
|
2
|
-
|
|
3
|
-
## 分层证据
|
|
4
|
-
|
|
5
|
-
| 层 | 最低证据 |
|
|
6
|
-
|---|---|
|
|
7
|
-
| 源码 | 协议/安全原语测试,静态扫描无 Secret/Token 日志 |
|
|
8
|
-
| 后端构建 | 隔离输出 `dotnet build` 成功,不覆盖共享运行目录 |
|
|
9
|
-
| 前端构建 | 现代包和项目要求的兼容包完成 |
|
|
10
|
-
| 应用包 | 可重复生成;Name/AppId/Version、DDL、字段数、菜单、空数据集、35 个接口引擎源码同源与 ResourcePolicies 校验 |
|
|
11
|
-
| 官方商城 | `microi_itdos` 发布后回读 `sys_microistore` 与官方资源 API;状态、版本、包哈希一致 |
|
|
12
|
-
| 目标租户 | 安装/升级任务终态 `Succeeded`,再读真实表、字段、菜单、安装版本 |
|
|
13
|
-
| 运行时 | Capabilities、Discovery/Metadata/JWKS 和实际使用端点命中已部署程序集 |
|
|
14
|
-
| 浏览器 | 登录入口、弹窗 Origin、URL 清理、管理页 7 Tab、秘密无明文 |
|
|
15
|
-
| 伙伴联调 | 登录/拒绝/过期/重放/退出/停用/角色变化/轮换 |
|
|
16
|
-
| 多节点 | state、code、ticket、session、撤销和缓存跨节点一致 |
|
|
17
|
-
|
|
18
|
-
## 官方应用发布
|
|
19
|
-
|
|
20
|
-
1. 使用官方 `microi_itdos`,核对绑定 `https://api.itdos.com` 与 `OsClient=iTdos`。
|
|
21
|
-
2. 在发布源更新真实 `diy_sso`、字段、表单 Tabs 和菜单视图并回读。
|
|
22
|
-
3. 导出精确菜单/表和 35 个接口引擎,不带连接数据、用户绑定、Secret、证书或示例账号;接口源码必须与 `Microi-V8-Engine/.../SSO身份联邦` 逐字同源。
|
|
23
|
-
4. AppId 固定 `app.microi.sso`,PublisherType 为官方应用;34 个核心 Key 为 `Managed/Platform`,`sso_event_hook` 为 `CreateIfMissing/Tenant`。
|
|
24
|
-
5. 发布后从官方资源 API 读取 `app.microi.sso.json`,校验 SHA-256、版本、1 菜单、1 表、64 字段、35 个接口引擎及策略。
|
|
25
|
-
6. 官方 iTdos 是发布源,安装任务被“发布源不允许安装”拒绝是保护性终态;不要绕过或伪装成成功。
|
|
26
|
-
7. 普通目标租户才执行安装/更新,并轮询后台任务到终态。Pending/Running/入队不算成功。
|
|
27
|
-
|
|
28
|
-
## 协议负向用例
|
|
29
|
-
|
|
30
|
-
- OIDC:state/nonce/PKCE 错、code 重放、issuer/audience 错、未知 kid、过期 token、refresh 重放、回调前缀攻击。
|
|
31
|
-
- SAML:签名错、过期、Audience/Destination/InResponseTo 错、Request/Assertion 重放、错误证书、未授权 ACS。
|
|
32
|
-
- CAS:ticket 重放、service 不同、过期 ticket、错误租户、CAS 失败响应。
|
|
33
|
-
- 通用:跨租户连接、停用用户、停用连接、SSRF 私网/回环、访问密钥会话授权、匿名读取 `diy_sso`。
|
|
34
|
-
|
|
35
|
-
## 结论措辞
|
|
36
|
-
|
|
37
|
-
只有真实伙伴和多节点验收也通过,才能说“该协议连接已可生产使用”。
|
|
38
|
-
|
|
39
|
-
- 包已发布但 Server/Client 未部署:写“官方配置包已发布,运行时代码待部署”。
|
|
40
|
-
- 端点冒烟通过但无真实 IdP/SP:写“协议端点已验证,伙伴联调待完成”。
|
|
41
|
-
- 官方源安装被保护性拒绝:写“发布源保护生效,不构成普通租户安装证据”。
|
|
42
|
-
- 因用户未授权输入密码而无法浏览器登录:写明 UI 登录后验收未完成,不用接口/源码代替视觉证据。
|
|
43
|
-
|
|
44
|
-
## 404 与应用缺失回归
|
|
45
|
-
|
|
46
|
-
- 客户端能力发现和登录完成只允许调用 `/apiengine/{ApiEngineKey}?OsClient=`;固定业务不得新增 `/api/ApiEngine/Run` 依赖。
|
|
47
|
-
- 在未安装 `app.microi.sso` 的租户调用通用入口,应返回结构化“接口引擎不存在”;不能返回 `/api/Sso/Capabilities` 路由 404。
|
|
48
|
-
- 安装后回读 35 个 `sys_apiengine` 行并刷新缓存,再验证 `sso_capabilities` 为 `Code=1`,并验证 24 个 `sso_http_*` 的 `ApiAddress`、`ResponseType=HTTP` 与 Managed 策略。
|
|
49
|
-
- 所有 `Sso*Controller.cs`、`/api/Sso/Capabilities`、`LegacyCapabilities`、`CompleteLogin`、`RotateClientSecret` 与 `/api/SysUser/SsoPengrui` 必须保持删除;`/api/Sso/Begin`、`CompleteAuthorization` 与回调地址只允许作为接口引擎 `ApiAddress` 存在。
|
|
1
|
+
# 验收、商城发布与交付结论
|
|
2
|
+
|
|
3
|
+
## 分层证据
|
|
4
|
+
|
|
5
|
+
| 层 | 最低证据 |
|
|
6
|
+
|---|---|
|
|
7
|
+
| 源码 | 协议/安全原语测试,静态扫描无 Secret/Token 日志 |
|
|
8
|
+
| 后端构建 | 隔离输出 `dotnet build` 成功,不覆盖共享运行目录 |
|
|
9
|
+
| 前端构建 | 现代包和项目要求的兼容包完成 |
|
|
10
|
+
| 应用包 | 可重复生成;Name/AppId/Version、DDL、字段数、菜单、空数据集、35 个接口引擎源码同源与 ResourcePolicies 校验 |
|
|
11
|
+
| 官方商城 | `microi_itdos` 发布后回读 `sys_microistore` 与官方资源 API;状态、版本、包哈希一致 |
|
|
12
|
+
| 目标租户 | 安装/升级任务终态 `Succeeded`,再读真实表、字段、菜单、安装版本 |
|
|
13
|
+
| 运行时 | Capabilities、Discovery/Metadata/JWKS 和实际使用端点命中已部署程序集 |
|
|
14
|
+
| 浏览器 | 登录入口、弹窗 Origin、URL 清理、管理页 7 Tab、秘密无明文 |
|
|
15
|
+
| 伙伴联调 | 登录/拒绝/过期/重放/退出/停用/角色变化/轮换 |
|
|
16
|
+
| 多节点 | state、code、ticket、session、撤销和缓存跨节点一致 |
|
|
17
|
+
|
|
18
|
+
## 官方应用发布
|
|
19
|
+
|
|
20
|
+
1. 使用官方 `microi_itdos`,核对绑定 `https://api.itdos.com` 与 `OsClient=iTdos`。
|
|
21
|
+
2. 在发布源更新真实 `diy_sso`、字段、表单 Tabs 和菜单视图并回读。
|
|
22
|
+
3. 导出精确菜单/表和 35 个接口引擎,不带连接数据、用户绑定、Secret、证书或示例账号;接口源码必须与 `Microi-V8-Engine/.../SSO身份联邦` 逐字同源。
|
|
23
|
+
4. AppId 固定 `app.microi.sso`,PublisherType 为官方应用;34 个核心 Key 为 `Managed/Platform`,`sso_event_hook` 为 `CreateIfMissing/Tenant`。
|
|
24
|
+
5. 发布后从官方资源 API 读取 `app.microi.sso.json`,校验 SHA-256、版本、1 菜单、1 表、64 字段、35 个接口引擎及策略。
|
|
25
|
+
6. 官方 iTdos 是发布源,安装任务被“发布源不允许安装”拒绝是保护性终态;不要绕过或伪装成成功。
|
|
26
|
+
7. 普通目标租户才执行安装/更新,并轮询后台任务到终态。Pending/Running/入队不算成功。
|
|
27
|
+
|
|
28
|
+
## 协议负向用例
|
|
29
|
+
|
|
30
|
+
- OIDC:state/nonce/PKCE 错、code 重放、issuer/audience 错、未知 kid、过期 token、refresh 重放、回调前缀攻击。
|
|
31
|
+
- SAML:签名错、过期、Audience/Destination/InResponseTo 错、Request/Assertion 重放、错误证书、未授权 ACS。
|
|
32
|
+
- CAS:ticket 重放、service 不同、过期 ticket、错误租户、CAS 失败响应。
|
|
33
|
+
- 通用:跨租户连接、停用用户、停用连接、SSRF 私网/回环、访问密钥会话授权、匿名读取 `diy_sso`。
|
|
34
|
+
|
|
35
|
+
## 结论措辞
|
|
36
|
+
|
|
37
|
+
只有真实伙伴和多节点验收也通过,才能说“该协议连接已可生产使用”。
|
|
38
|
+
|
|
39
|
+
- 包已发布但 Server/Client 未部署:写“官方配置包已发布,运行时代码待部署”。
|
|
40
|
+
- 端点冒烟通过但无真实 IdP/SP:写“协议端点已验证,伙伴联调待完成”。
|
|
41
|
+
- 官方源安装被保护性拒绝:写“发布源保护生效,不构成普通租户安装证据”。
|
|
42
|
+
- 因用户未授权输入密码而无法浏览器登录:写明 UI 登录后验收未完成,不用接口/源码代替视觉证据。
|
|
43
|
+
|
|
44
|
+
## 404 与应用缺失回归
|
|
45
|
+
|
|
46
|
+
- 客户端能力发现和登录完成只允许调用 `/apiengine/{ApiEngineKey}?OsClient=`;固定业务不得新增 `/api/ApiEngine/Run` 依赖。
|
|
47
|
+
- 在未安装 `app.microi.sso` 的租户调用通用入口,应返回结构化“接口引擎不存在”;不能返回 `/api/Sso/Capabilities` 路由 404。
|
|
48
|
+
- 安装后回读 35 个 `sys_apiengine` 行并刷新缓存,再验证 `sso_capabilities` 为 `Code=1`,并验证 24 个 `sso_http_*` 的 `ApiAddress`、`ResponseType=HTTP` 与 Managed 策略。
|
|
49
|
+
- 所有 `Sso*Controller.cs`、`/api/Sso/Capabilities`、`LegacyCapabilities`、`CompleteLogin`、`RotateClientSecret` 与 `/api/SysUser/SsoPengrui` 必须保持删除;`/api/Sso/Begin`、`CompleteAuthorization` 与回调地址只允许作为接口引擎 `ApiAddress` 存在。
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
# 配置、Secret、安全与迁移
|
|
2
|
-
|
|
3
|
-
## diy_sso 分组
|
|
4
|
-
|
|
5
|
-
- `basic`:Key、名称、方向、协议、启用、排序。
|
|
6
|
-
- `oidc`:Issuer/Discovery/端点、Client、Scope、精确 Redirect URI。
|
|
7
|
-
- `saml`:Entity ID、Metadata、SSO/SLO、ACS。
|
|
8
|
-
- `cas`:Server URL、版本。
|
|
9
|
-
- `mapping`:Subject/Account/Name/Email/Role Claim、JSON 映射、JIT。
|
|
10
|
-
- `security`:Secret/证书设置 Key、签名/加密、PKCE/nonce、生命周期、私网开关。
|
|
11
|
-
- `legacy`:旧 Server/Client API、TokenName、GetTokenType。
|
|
12
|
-
|
|
13
|
-
`diy_sso` 是管理员专用平台表。匿名能力接口只投影 ConnectionKey、名称、协议、图标、说明和发起地址;旧兼容投影只允许同源 `/api/` 路径与安全 Token 参数名。
|
|
14
|
-
|
|
15
|
-
匿名投影由 `sso_capabilities` / `sso_legacy_capabilities` 接口引擎提供;任何 Controller 都不得直接查询并返回 `diy_sso`。公开协议地址由 `sso_http_*` Managed 接口引擎拥有,可信原子再通过 StopHttp 的 `sso_connection_runtime` 取得最小运行投影。客户端能力类接口统一调用 `/apiengine/{ApiEngineKey}?OsClient=`;标准伙伴协议使用应用声明的 `ApiAddress`,其中 `{OsClient}`、`{ConnectionKey}` 由动态路由安全提取并覆盖同名外部参数。
|
|
16
|
-
|
|
17
|
-
## Secret 与证书
|
|
18
|
-
|
|
19
|
-
- `ClientSecretSettingKey` 等字段只存 `mci_system_setting` Key。
|
|
20
|
-
- 第三方 Client Secret 和私钥证书使用后端 Secret 存储,不出现在日志、导出、包、浏览器或 MCP 回读。
|
|
21
|
-
- 吾码对外 OIDC Client Secret 只存专用密码哈希;不能用 AES/DES 代替验证哈希。
|
|
22
|
-
- SAML 验签/加密公开证书与签名/解密私钥严格区分用途。
|
|
23
|
-
- 证书/签名 Key 轮换要有新旧重叠、伙伴确认、撤销和回滚窗口。
|
|
24
|
-
|
|
25
|
-
## 网络和 URL
|
|
26
|
-
|
|
27
|
-
所有外部 Discovery、JWKS、Metadata、Token、UserInfo 地址先过 HTTPS/SSRF 检查。默认拒绝回环、私网、链路本地、带用户信息 URL 和 DNS 重绑定;内网 IdP 只能由管理员显式开启并用网络出口白名单补强。
|
|
28
|
-
|
|
29
|
-
Redirect/Logout/ACS/CAS service 使用规范化后的绝对 URL 精确比较。不要允许通配符、子域后缀、前缀或 fragment。反向代理下使用可信外部 Origin,不能根据任意 Host/Header 构造安全回调。
|
|
30
|
-
|
|
31
|
-
## 账号与角色
|
|
32
|
-
|
|
33
|
-
默认 `BoundOnly`。JIT 需要:
|
|
34
|
-
|
|
35
|
-
- 稳定 Subject 与账号唯一性。
|
|
36
|
-
- 非管理员默认角色。
|
|
37
|
-
- 外部角色到 RoleId 的显式 allowlist。
|
|
38
|
-
- 离职、禁用、角色收回与冲突处理。
|
|
39
|
-
- 创建、匹配、拒绝和变更审计。
|
|
40
|
-
|
|
41
|
-
这些规则由 Managed `sso_resolve_federated_identity` 编排。JIT 创建最终调用精确受限的 `V8.Method.CreateFederatedUser` 原子,并用平台专用带盐密码哈希写入不可登录的随机初始密码;不得回退到 DES,也不得把外部角色名直接写成平台 RoleId。
|
|
42
|
-
|
|
43
|
-
不能把外部 `admin` 字符串、邮箱域或昵称直接解释为平台管理员。
|
|
44
|
-
|
|
45
|
-
## LegacyToken 迁移
|
|
46
|
-
|
|
47
|
-
1. 盘点旧 `ClientSsoApi/ServerSsoApi/TokenName` 和使用系统。
|
|
48
|
-
2. 为每个系统选择 OIDC、SAML2 或 CAS 并建立新连接。
|
|
49
|
-
3. 并行验证登录/退出和账号映射;新入口默认标准协议。
|
|
50
|
-
4. URL 中的旧 Token 读取后立即清理,不写 Referer、日志或分析平台。
|
|
51
|
-
5. 迁移完成后停用旧行;不要继续给新系统复制 LegacyToken。
|
|
52
|
-
|
|
53
|
-
旧兼容只允许调用同源 `/api/`,绝不把 DiyToken POST 到管理员配置的任意绝对 URL。浏览器只处理 `LegacyCapabilities` 已返回连接中明确登记的 `TokenName`;不得恢复“只要 URL 出现 `?token=` 就自动登录”的无配置旁路。
|
|
1
|
+
# 配置、Secret、安全与迁移
|
|
2
|
+
|
|
3
|
+
## diy_sso 分组
|
|
4
|
+
|
|
5
|
+
- `basic`:Key、名称、方向、协议、启用、排序。
|
|
6
|
+
- `oidc`:Issuer/Discovery/端点、Client、Scope、精确 Redirect URI。
|
|
7
|
+
- `saml`:Entity ID、Metadata、SSO/SLO、ACS。
|
|
8
|
+
- `cas`:Server URL、版本。
|
|
9
|
+
- `mapping`:Subject/Account/Name/Email/Role Claim、JSON 映射、JIT。
|
|
10
|
+
- `security`:Secret/证书设置 Key、签名/加密、PKCE/nonce、生命周期、私网开关。
|
|
11
|
+
- `legacy`:旧 Server/Client API、TokenName、GetTokenType。
|
|
12
|
+
|
|
13
|
+
`diy_sso` 是管理员专用平台表。匿名能力接口只投影 ConnectionKey、名称、协议、图标、说明和发起地址;旧兼容投影只允许同源 `/api/` 路径与安全 Token 参数名。
|
|
14
|
+
|
|
15
|
+
匿名投影由 `sso_capabilities` / `sso_legacy_capabilities` 接口引擎提供;任何 Controller 都不得直接查询并返回 `diy_sso`。公开协议地址由 `sso_http_*` Managed 接口引擎拥有,可信原子再通过 StopHttp 的 `sso_connection_runtime` 取得最小运行投影。客户端能力类接口统一调用 `/apiengine/{ApiEngineKey}?OsClient=`;标准伙伴协议使用应用声明的 `ApiAddress`,其中 `{OsClient}`、`{ConnectionKey}` 由动态路由安全提取并覆盖同名外部参数。
|
|
16
|
+
|
|
17
|
+
## Secret 与证书
|
|
18
|
+
|
|
19
|
+
- `ClientSecretSettingKey` 等字段只存 `mci_system_setting` Key。
|
|
20
|
+
- 第三方 Client Secret 和私钥证书使用后端 Secret 存储,不出现在日志、导出、包、浏览器或 MCP 回读。
|
|
21
|
+
- 吾码对外 OIDC Client Secret 只存专用密码哈希;不能用 AES/DES 代替验证哈希。
|
|
22
|
+
- SAML 验签/加密公开证书与签名/解密私钥严格区分用途。
|
|
23
|
+
- 证书/签名 Key 轮换要有新旧重叠、伙伴确认、撤销和回滚窗口。
|
|
24
|
+
|
|
25
|
+
## 网络和 URL
|
|
26
|
+
|
|
27
|
+
所有外部 Discovery、JWKS、Metadata、Token、UserInfo 地址先过 HTTPS/SSRF 检查。默认拒绝回环、私网、链路本地、带用户信息 URL 和 DNS 重绑定;内网 IdP 只能由管理员显式开启并用网络出口白名单补强。
|
|
28
|
+
|
|
29
|
+
Redirect/Logout/ACS/CAS service 使用规范化后的绝对 URL 精确比较。不要允许通配符、子域后缀、前缀或 fragment。反向代理下使用可信外部 Origin,不能根据任意 Host/Header 构造安全回调。
|
|
30
|
+
|
|
31
|
+
## 账号与角色
|
|
32
|
+
|
|
33
|
+
默认 `BoundOnly`。JIT 需要:
|
|
34
|
+
|
|
35
|
+
- 稳定 Subject 与账号唯一性。
|
|
36
|
+
- 非管理员默认角色。
|
|
37
|
+
- 外部角色到 RoleId 的显式 allowlist。
|
|
38
|
+
- 离职、禁用、角色收回与冲突处理。
|
|
39
|
+
- 创建、匹配、拒绝和变更审计。
|
|
40
|
+
|
|
41
|
+
这些规则由 Managed `sso_resolve_federated_identity` 编排。JIT 创建最终调用精确受限的 `V8.Method.CreateFederatedUser` 原子,并用平台专用带盐密码哈希写入不可登录的随机初始密码;不得回退到 DES,也不得把外部角色名直接写成平台 RoleId。
|
|
42
|
+
|
|
43
|
+
不能把外部 `admin` 字符串、邮箱域或昵称直接解释为平台管理员。
|
|
44
|
+
|
|
45
|
+
## LegacyToken 迁移
|
|
46
|
+
|
|
47
|
+
1. 盘点旧 `ClientSsoApi/ServerSsoApi/TokenName` 和使用系统。
|
|
48
|
+
2. 为每个系统选择 OIDC、SAML2 或 CAS 并建立新连接。
|
|
49
|
+
3. 并行验证登录/退出和账号映射;新入口默认标准协议。
|
|
50
|
+
4. URL 中的旧 Token 读取后立即清理,不写 Referer、日志或分析平台。
|
|
51
|
+
5. 迁移完成后停用旧行;不要继续给新系统复制 LegacyToken。
|
|
52
|
+
|
|
53
|
+
旧兼容只允许调用同源 `/api/`,绝不把 DiyToken POST 到管理员配置的任意绝对 URL。浏览器只处理 `LegacyCapabilities` 已返回连接中明确登记的 `TokenName`;不得恢复“只要 URL 出现 `?token=` 就自动登录”的无配置旁路。
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
# 外部身份源登录吾码
|
|
2
|
-
|
|
3
|
-
## 目标流程
|
|
4
|
-
|
|
5
|
-
外部身份源只证明主体身份。回调完成后按当前租户查找绑定/受控 JIT 用户,重新确认 `sys_user` 仍启用,再签发 DiyToken。菜单、表、字段、角色、部门与数据范围不从外部 Token 直接继承。
|
|
6
|
-
|
|
7
|
-
## OIDC RP
|
|
8
|
-
|
|
9
|
-
必须覆盖:
|
|
10
|
-
|
|
11
|
-
- Authorization Code;公共客户端使用 PKCE S256。
|
|
12
|
-
- 随机 state、nonce、短时效、一次性消费和原始 Origin 绑定。
|
|
13
|
-
- Discovery 与 JWKS 的 HTTPS、SSRF、issuer 一致性和缓存更新。
|
|
14
|
-
- id_token 签名、算法、issuer、audience、有效期、nonce;必要时再请求 UserInfo。
|
|
15
|
-
- code 不能写日志、URL 清理、回调错误不泄露 Token/Secret。
|
|
16
|
-
- `client_secret_basic`、`client_secret_post` 或 `none` 与伙伴注册一致。
|
|
17
|
-
|
|
18
|
-
禁止 Implicit、Password Grant、宽松回调前缀、关闭签名或仅解码 JWT 不验签。
|
|
19
|
-
|
|
20
|
-
## SAML SP
|
|
21
|
-
|
|
22
|
-
必须覆盖:
|
|
23
|
-
|
|
24
|
-
- SP Metadata、AuthnRequest、RelayState、ACS 与可选 SLO。
|
|
25
|
-
- 浏览器回调使用 `/api/Sso/SamlCallback`,Assertion Consumer Service 使用 `/api/Sso/SamlAcs`。
|
|
26
|
-
- Response/Assertion 签名、Destination、Issuer、Audience、时间窗口、InResponseTo。
|
|
27
|
-
- Request ID 与 Assertion/Response 重放保护。
|
|
28
|
-
- 加密断言时使用本租户解密私钥;验签只用伙伴公开证书。
|
|
29
|
-
- NameID/Claim 到稳定 Subject 的明确规则。
|
|
30
|
-
|
|
31
|
-
不能因为伙伴证书配置困难而在生产关闭签名校验。
|
|
32
|
-
|
|
33
|
-
## CAS Client
|
|
34
|
-
|
|
35
|
-
- service 必须是精确、受控的吾码回调 URL。
|
|
36
|
-
- CAS 1.0 `/validate`、2.0 `/serviceValidate`、3.0 `/p3/serviceValidate` 按配置解析。
|
|
37
|
-
- Service Ticket 单次使用、短时效、绑定 service;失败响应不能当作用户属性。
|
|
38
|
-
- CAS 根地址生产使用 HTTPS,并经过 SSRF 检查。
|
|
39
|
-
|
|
40
|
-
## 用户解析顺序
|
|
41
|
-
|
|
42
|
-
1. 规范化 `OsClient`、连接方向和协议。
|
|
43
|
-
2. 提取稳定 Subject;拒绝空值、控制字符和不稳定昵称。
|
|
44
|
-
3. 先查 `mci_user_external_identity` 的精确绑定。
|
|
45
|
-
4. `BoundOnly` 未绑定即拒绝;`JitMatch/JitCreate` 仅按已审核映射运行。
|
|
46
|
-
5. 重新读取 `sys_user`,确认未删除、未停用。
|
|
47
|
-
6. 签发 DiyToken,写不含凭据的 SSO 审计。
|
|
48
|
-
|
|
49
|
-
步骤 2–5 固定由 `sso_resolve_federated_identity` 执行;`sso_http_oidc_callback`、`sso_http_saml_acs`、`sso_http_cas_callback` 只通过 `RunSsoProtocol` 取得已经验签、归一化且不含原始 Token/断言的 Claim。步骤 6 由 `sso_complete_login` 编排并调用一次性票据/DiyToken 原子。禁止为 OIDC、SAML、CAS 恢复 Controller 或各复制一套用户查询、JIT 和角色映射。
|
|
50
|
-
|
|
51
|
-
## 浏览器回调
|
|
52
|
-
|
|
53
|
-
弹窗消息必须同时校验 `event.source`、精确 `event.origin`、消息类型和 ConnectionKey。回调只传 90 秒左右的一次性票据;登录页再用该票据换 DiyToken。不要通过 `postMessage('*')`、URL fragment 或 Query 传 DiyToken。
|
|
1
|
+
# 外部身份源登录吾码
|
|
2
|
+
|
|
3
|
+
## 目标流程
|
|
4
|
+
|
|
5
|
+
外部身份源只证明主体身份。回调完成后按当前租户查找绑定/受控 JIT 用户,重新确认 `sys_user` 仍启用,再签发 DiyToken。菜单、表、字段、角色、部门与数据范围不从外部 Token 直接继承。
|
|
6
|
+
|
|
7
|
+
## OIDC RP
|
|
8
|
+
|
|
9
|
+
必须覆盖:
|
|
10
|
+
|
|
11
|
+
- Authorization Code;公共客户端使用 PKCE S256。
|
|
12
|
+
- 随机 state、nonce、短时效、一次性消费和原始 Origin 绑定。
|
|
13
|
+
- Discovery 与 JWKS 的 HTTPS、SSRF、issuer 一致性和缓存更新。
|
|
14
|
+
- id_token 签名、算法、issuer、audience、有效期、nonce;必要时再请求 UserInfo。
|
|
15
|
+
- code 不能写日志、URL 清理、回调错误不泄露 Token/Secret。
|
|
16
|
+
- `client_secret_basic`、`client_secret_post` 或 `none` 与伙伴注册一致。
|
|
17
|
+
|
|
18
|
+
禁止 Implicit、Password Grant、宽松回调前缀、关闭签名或仅解码 JWT 不验签。
|
|
19
|
+
|
|
20
|
+
## SAML SP
|
|
21
|
+
|
|
22
|
+
必须覆盖:
|
|
23
|
+
|
|
24
|
+
- SP Metadata、AuthnRequest、RelayState、ACS 与可选 SLO。
|
|
25
|
+
- 浏览器回调使用 `/api/Sso/SamlCallback`,Assertion Consumer Service 使用 `/api/Sso/SamlAcs`。
|
|
26
|
+
- Response/Assertion 签名、Destination、Issuer、Audience、时间窗口、InResponseTo。
|
|
27
|
+
- Request ID 与 Assertion/Response 重放保护。
|
|
28
|
+
- 加密断言时使用本租户解密私钥;验签只用伙伴公开证书。
|
|
29
|
+
- NameID/Claim 到稳定 Subject 的明确规则。
|
|
30
|
+
|
|
31
|
+
不能因为伙伴证书配置困难而在生产关闭签名校验。
|
|
32
|
+
|
|
33
|
+
## CAS Client
|
|
34
|
+
|
|
35
|
+
- service 必须是精确、受控的吾码回调 URL。
|
|
36
|
+
- CAS 1.0 `/validate`、2.0 `/serviceValidate`、3.0 `/p3/serviceValidate` 按配置解析。
|
|
37
|
+
- Service Ticket 单次使用、短时效、绑定 service;失败响应不能当作用户属性。
|
|
38
|
+
- CAS 根地址生产使用 HTTPS,并经过 SSRF 检查。
|
|
39
|
+
|
|
40
|
+
## 用户解析顺序
|
|
41
|
+
|
|
42
|
+
1. 规范化 `OsClient`、连接方向和协议。
|
|
43
|
+
2. 提取稳定 Subject;拒绝空值、控制字符和不稳定昵称。
|
|
44
|
+
3. 先查 `mci_user_external_identity` 的精确绑定。
|
|
45
|
+
4. `BoundOnly` 未绑定即拒绝;`JitMatch/JitCreate` 仅按已审核映射运行。
|
|
46
|
+
5. 重新读取 `sys_user`,确认未删除、未停用。
|
|
47
|
+
6. 签发 DiyToken,写不含凭据的 SSO 审计。
|
|
48
|
+
|
|
49
|
+
步骤 2–5 固定由 `sso_resolve_federated_identity` 执行;`sso_http_oidc_callback`、`sso_http_saml_acs`、`sso_http_cas_callback` 只通过 `RunSsoProtocol` 取得已经验签、归一化且不含原始 Token/断言的 Claim。步骤 6 由 `sso_complete_login` 编排并调用一次性票据/DiyToken 原子。禁止为 OIDC、SAML、CAS 恢复 Controller 或各复制一套用户查询、JIT 和角色映射。
|
|
50
|
+
|
|
51
|
+
## 浏览器回调
|
|
52
|
+
|
|
53
|
+
弹窗消息必须同时校验 `event.source`、精确 `event.origin`、消息类型和 ConnectionKey。回调只传 90 秒左右的一次性票据;登录页再用该票据换 DiyToken。不要通过 `postMessage('*')`、URL fragment 或 Query 传 DiyToken。
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
# 吾码向第三方提供登录
|
|
2
|
-
|
|
3
|
-
## 共同边界
|
|
4
|
-
|
|
5
|
-
先验证当前交互式 DiyToken,再生成第三方协议票据。访问密钥会话不能替代用户交互授权。外部 Client/SP/service 只能读取按 Scope/映射允许的最小资料,不能获得 DiyToken、菜单权限对象或内部角色策略。
|
|
6
|
-
|
|
7
|
-
## OIDC Provider
|
|
8
|
-
|
|
9
|
-
应提供:
|
|
10
|
-
|
|
11
|
-
- Discovery、JWKS、Authorize、Token、UserInfo。
|
|
12
|
-
- 机密客户端认证与公共客户端 PKCE S256。
|
|
13
|
-
- 一次性授权码,绑定 ClientId、Redirect URI、Scope、PKCE、用户、租户和过期时间。
|
|
14
|
-
- 签名 id_token,校验 nonce;按客户端派生 pairwise subject。
|
|
15
|
-
- 高熵不透明 Access/Refresh Token;仅保存哈希索引。
|
|
16
|
-
- Refresh Token rotation/reuse detection,family 撤销。
|
|
17
|
-
- Introspection、Revocation、RP-Initiated Logout 与精确 post-logout redirect。
|
|
18
|
-
|
|
19
|
-
Client Secret 轮换动作只显示一次明文,持久化 PBKDF2-SHA256 哈希。签名 Key 必须有 `kid`,轮换时保留验证重叠窗口。
|
|
20
|
-
|
|
21
|
-
对外 Claim 固定由 `sso_outbound_claims` 从启用用户与连接白名单生成;24 个 `sso_http_*` Managed 端点通过 `RunSsoProtocol` 把同一投影编码成 OIDC/SAML/CAS 响应。Client Secret 轮换由 `sso_rotate_client_secret` 编排,并调用精确受限的可信原子生成一次性明文与持久哈希,不能恢复为 Controller 定制动作。
|
|
22
|
-
|
|
23
|
-
## SAML IdP
|
|
24
|
-
|
|
25
|
-
应提供 IdP Metadata、SSO、签名 Response/Assertion、可选加密和 SLO。必须校验 SP Entity ID、ACS、Destination、AuthnRequest 签名/重放;Attribute 只来自白名单映射。每个伙伴独立证书/配置,不把私钥放进应用包或前端。
|
|
26
|
-
|
|
27
|
-
## CAS Server
|
|
28
|
-
|
|
29
|
-
应提供 `/login`、CAS 1.0 `/validate`、CAS 2.0 `/serviceValidate`、CAS 3.0 `/p3/serviceValidate` 和 `/logout`。Service Ticket 必须:
|
|
30
|
-
|
|
31
|
-
- 随机、短时、单次使用。
|
|
32
|
-
- 绑定当前租户、连接、用户和精确 service。
|
|
33
|
-
- 校验成功才返回用户属性;CAS 1.0 使用协议规定的 yes/no 文本。
|
|
34
|
-
|
|
35
|
-
当前不实现 CAS Proxy Ticket;需要代理链时先评估改用 OIDC。
|
|
36
|
-
|
|
37
|
-
## 授权页面
|
|
38
|
-
|
|
39
|
-
第三方发起 Authorize/SAML/CAS 登录后,若没有有效 Provider Session,先跳到吾码登录页;登录成功回到一次性 handoff。页面必须说明目标系统、请求 Scope 和退出影响。即使后续加入 Consent,仍不能把第三方请求的任意 Scope 自动映射为吾码管理员能力。
|
|
1
|
+
# 吾码向第三方提供登录
|
|
2
|
+
|
|
3
|
+
## 共同边界
|
|
4
|
+
|
|
5
|
+
先验证当前交互式 DiyToken,再生成第三方协议票据。访问密钥会话不能替代用户交互授权。外部 Client/SP/service 只能读取按 Scope/映射允许的最小资料,不能获得 DiyToken、菜单权限对象或内部角色策略。
|
|
6
|
+
|
|
7
|
+
## OIDC Provider
|
|
8
|
+
|
|
9
|
+
应提供:
|
|
10
|
+
|
|
11
|
+
- Discovery、JWKS、Authorize、Token、UserInfo。
|
|
12
|
+
- 机密客户端认证与公共客户端 PKCE S256。
|
|
13
|
+
- 一次性授权码,绑定 ClientId、Redirect URI、Scope、PKCE、用户、租户和过期时间。
|
|
14
|
+
- 签名 id_token,校验 nonce;按客户端派生 pairwise subject。
|
|
15
|
+
- 高熵不透明 Access/Refresh Token;仅保存哈希索引。
|
|
16
|
+
- Refresh Token rotation/reuse detection,family 撤销。
|
|
17
|
+
- Introspection、Revocation、RP-Initiated Logout 与精确 post-logout redirect。
|
|
18
|
+
|
|
19
|
+
Client Secret 轮换动作只显示一次明文,持久化 PBKDF2-SHA256 哈希。签名 Key 必须有 `kid`,轮换时保留验证重叠窗口。
|
|
20
|
+
|
|
21
|
+
对外 Claim 固定由 `sso_outbound_claims` 从启用用户与连接白名单生成;24 个 `sso_http_*` Managed 端点通过 `RunSsoProtocol` 把同一投影编码成 OIDC/SAML/CAS 响应。Client Secret 轮换由 `sso_rotate_client_secret` 编排,并调用精确受限的可信原子生成一次性明文与持久哈希,不能恢复为 Controller 定制动作。
|
|
22
|
+
|
|
23
|
+
## SAML IdP
|
|
24
|
+
|
|
25
|
+
应提供 IdP Metadata、SSO、签名 Response/Assertion、可选加密和 SLO。必须校验 SP Entity ID、ACS、Destination、AuthnRequest 签名/重放;Attribute 只来自白名单映射。每个伙伴独立证书/配置,不把私钥放进应用包或前端。
|
|
26
|
+
|
|
27
|
+
## CAS Server
|
|
28
|
+
|
|
29
|
+
应提供 `/login`、CAS 1.0 `/validate`、CAS 2.0 `/serviceValidate`、CAS 3.0 `/p3/serviceValidate` 和 `/logout`。Service Ticket 必须:
|
|
30
|
+
|
|
31
|
+
- 随机、短时、单次使用。
|
|
32
|
+
- 绑定当前租户、连接、用户和精确 service。
|
|
33
|
+
- 校验成功才返回用户属性;CAS 1.0 使用协议规定的 yes/no 文本。
|
|
34
|
+
|
|
35
|
+
当前不实现 CAS Proxy Ticket;需要代理链时先评估改用 OIDC。
|
|
36
|
+
|
|
37
|
+
## 授权页面
|
|
38
|
+
|
|
39
|
+
第三方发起 Authorize/SAML/CAS 登录后,若没有有效 Provider Session,先跳到吾码登录页;登录成功回到一次性 handoff。页面必须说明目标系统、请求 Scope 和退出影响。即使后续加入 Consent,仍不能把第三方请求的任意 Scope 自动映射为吾码管理员能力。
|
|
@@ -16,7 +16,7 @@ Manifest 使用 `tables[].formBanner`;未显式配置时仍按字段类型选
|
|
|
16
16
|
模块引擎或 `sys_menu`。逐步建模在字段完成后调用 `microi_configure_form_banner` 回读验收。
|
|
17
17
|
|
|
18
18
|
<!-- microi-progressive:begin -->
|
|
19
|
-
<!-- microi-progressive:chunk id=microi-system-delivery-000 sha256=
|
|
19
|
+
<!-- microi-progressive:chunk id=microi-system-delivery-000 sha256=acb3a22e04ba26f9fda584956e1eff38c9deebaeb827a7fc3a947abdac4214a6 -->
|
|
20
20
|
## 交付总原则
|
|
21
21
|
|
|
22
22
|
1. **先事实源,后建模**:先读需求文档、截图、现有蓝图、数据库结构和菜单结构,形成业务蓝图;不要边猜边建表、边猜边写接口。
|
|
@@ -26,7 +26,8 @@ Manifest 使用 `tables[].formBanner`;未显式配置时仍按字段类型选
|
|
|
26
26
|
5. **测试不等于接口能通**:交付前必须跑构建、接口契约、真实登录、核心写流程、截图、人眼复核、网络 404/5xx 守卫、远端同步状态。
|
|
27
27
|
6. **生产数据谨慎优先**:涉及真实会员、余额、积分、订单、库存、卡券、收益、佣金、分润等资金/资产数据时,先确认服务器、租户、目标表、筛选条件和影响范围,再执行 MCP、接口引擎或 SQL 写操作。除用户明确要求清理/重置或必须修复错误数据外,不得擅自批量改真实数据。
|
|
28
28
|
7. **默认按分布式交付**:任何后端能力都假设会有至少两个节点连接同一数据库和 Redis,并经历滚动升级、重复投递与节点硬重启。定时任务/消费者使用分布式租约且业务本身幂等;会话、票据和任务状态使用共享存储;新旧版本并存时采用“先扩展、后迁移、再收缩”。只在单节点验证通过不能视为完整交付。
|
|
29
|
-
8. **业务逻辑默认接口引擎、元数据升级默认应用商城**:先用低代码 CRUD/事件,再用接口引擎;只缺底层原子能力时先扩展 V8,只有协议/鉴权/密钥隔离/运行时内核才进入 C#。表、字段、Tab、菜单、权限、引擎、页面和任务等可打包资源不得新增 `Microi.Upgrade` 定制类;官方开发者通过 `microi_itdos` 发布官方应用后再由目标租户 MCP 更新,无官方权限时只升级自己的租户。
|
|
29
|
+
8. **业务逻辑默认接口引擎、元数据升级默认应用商城**:先用低代码 CRUD/事件,再用接口引擎;只缺底层原子能力时先扩展 V8,只有协议/鉴权/密钥隔离/运行时内核才进入 C#。表、字段、Tab、菜单、权限、引擎、页面和任务等可打包资源不得新增 `Microi.Upgrade` 定制类;官方开发者通过 `microi_itdos` 发布官方应用后再由目标租户 MCP 更新,无官方权限时只升级自己的租户。
|
|
30
|
+
9. **平台能力四项同步**:按 `workspace-conventions/SKILL.md` 首部识别创始人源码工作区;每项平台新增、增强或修复都逐项判断应用商城、官方中文文档、Skills、MCP 是否需要完善,交付时列出证据或无需修改的依据。复用已有 MCP 能力,不机械新增工具;镜像发布不等于客户部署,客户手动更新边界必须保留。
|
|
30
31
|
|
|
31
32
|
<!-- /microi-progressive:chunk -->
|
|
32
33
|
<!-- microi-progressive:chunk id=microi-system-delivery-001 sha256=174d99145946baf94a5eee934fc1453921fa7eed544b853f86be515582dc1343 -->
|
|
@@ -45,7 +46,7 @@ Manifest 使用 `tables[].formBanner`;未显式配置时仍按字段类型选
|
|
|
45
46
|
最终回复必须按原始编号逐项汇总:哪些已实现、哪些未实现、是否通过全自动化测试、是否通过截图验证。不能只给总括性“都完成了”。如果某项没有测试或没有截图,必须明说“未覆盖/未截图”,并说明原因。
|
|
46
47
|
|
|
47
48
|
<!-- /microi-progressive:chunk -->
|
|
48
|
-
<!-- microi-progressive:chunk id=microi-system-delivery-002 sha256=
|
|
49
|
+
<!-- microi-progressive:chunk id=microi-system-delivery-002 sha256=65a36ed6c448bbfb0226acedaaa334046be68278b2e89eb301cd99b4e141da3e -->
|
|
49
50
|
## 平台安全与存量兼容验收(强制)
|
|
50
51
|
|
|
51
52
|
AI 零代码交付不能只验证管理员帐号和页面能打开。任何涉及 FormEngine、菜单、角色、子表、文件、SaaS 或登录协议的交付,都必须按以下服务端边界设计和验收:
|
|
@@ -70,7 +71,7 @@ AI 零代码交付不能只验证管理员帐号和页面能打开。任何涉
|
|
|
70
71
|
### 上传、私有文件与 SaaS
|
|
71
72
|
|
|
72
73
|
- 上传业务默认值为 100 MB/文件、200 MB/次、10 文件、2 GB/帐号/日、20 GB/租户/日。有效值只按当前租户 `sys_osclients` → 代码安全默认值解析,租户可以提高或降低业务默认值;不得为上传开关、额度或硬上限新增 API 环境变量或 `appsettings` 节点。最终仍受代码内不可突破的灾难保护、HTTP/Multipart/Form 和反向代理上限约束。共享 Redis 原子预留,Redis 故障失败关闭。
|
|
73
|
-
-
|
|
74
|
+
- 无字段上下文的普通交互式上传默认私有桶,一级安全目录为 `file`、`img`、`avatar`、`editor`;可由管理员在普通 `sys_config.HdfsUploadRules` 按真实角色授权业务目录与公有权限。通配符必须有界并先校验实际路径,保留目录与跨租户不能放行。标准表单仍按权威字段配置执行。可信后端 V8 仍受全局文件大小硬上限。
|
|
74
75
|
- 普通客户端私有文件签名必须提交 `FormEngineKey`、`FormDataId`、`FieldId`、`SysMenuId` 并验证记录字段真实引用;不能把后端 `V8.Method.GetPrivateFileUrl({FilePathName})` 的可信调用方式照搬到浏览器。
|
|
75
76
|
- Upgrade16 六个上传字段全部可空,空值保持老租户兼容;升级后回读字段元数据、租户值并刷新 SaaS 缓存。
|
|
76
77
|
- `V8.OsClientModel` / `V8.SysConfig` 只使用脱敏副本,不返回整个对象。新租户不能复制主租户整条 `sys_osclients`;数据库、认证、Redis、存储、MQ/MQTT、搜索凭据必须独立创建或由服务端托管。
|
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=microi-system-delivery-006 sha256=
|
|
5
|
+
<!-- microi-progressive:chunk id=microi-system-delivery-006 sha256=7e836f587a670e0be56abf880f6164a739ef1a31cfdb3864c09697a1980a3910 -->
|
|
6
6
|
## 自动化测试必须覆盖的坑
|
|
7
7
|
|
|
8
|
-
### 后端统一测试与发布门禁
|
|
8
|
+
### 后端统一测试与发布门禁
|
|
9
|
+
|
|
10
|
+
- 每一个新功能或 Bug 修复必须提供对应回归用例;C# 进入 `Microi.Tests`,前端与资源/V8 测试进入统一 Node 自动发现范围。修复先保留失败证据,再跑成功、边界、异常、权限及旧格式兼容用例;不能仅添加字符串存在断言替代行为测试。
|
|
11
|
+
- `run-node-regressions.mjs` 自动发现 `Microi.Tests`、`Microi.Upgrade/Resource`、`Microi.Client/tests` 的确定性测试。新文件无法分类即失败;Playwright 用例必须走真实浏览器入口,不能用 Node 执行后把跳过当通过。所有计数需回读,0 用例、失败、取消、skipped、todo 均拒绝发布。
|
|
12
|
+
- 仅推送模式也必须取得发布锁并执行 Full。源码候选哈希、构建上下文哈希与 `release-artifact.mjs` 回执必须一致,且每个 Docker push 前再验证;无回执的历史产物不允许上传。文档专用模式不运行无关后端业务测试。
|
|
13
|
+
- 测试评审按身份/权限、多租户隔离、CRUD/事务、V8 同步异步与 `return/V8.Result`、存储安全、缓存/任务幂等、升级回滚、应用包幂等、浏览器登录/目标路由、发布脚本失败关闭分类盘点。新增能力补所在分类,不承诺一轮测试覆盖所有未知业务。
|
|
9
14
|
|
|
10
15
|
- 吾码后端统一测试入口是 `Microi.Server/Microi.Tests/Microi.Tests.csproj`,
|
|
11
16
|
不得重新创建 `Dos.Common.Tests`、`Dos.ORM.Tests` 等分散入口。
|
|
@@ -63,8 +63,13 @@ Microi.UI 不只是组件集合,它是 AI 构建软件的视觉交付标准:
|
|
|
63
63
|
- `Microi.UI/src/uniapp`:uni-app Vue 3 组件。
|
|
64
64
|
|
|
65
65
|
<!-- /microi-progressive:chunk -->
|
|
66
|
-
<!-- microi-progressive:chunk id=microi-ui-003 sha256=
|
|
67
|
-
## 默认要求
|
|
66
|
+
<!-- microi-progressive:chunk id=microi-ui-003 sha256=29586a620e8e76e0d08fa6cf48c1275154d009b734f341da455c802426cc315b -->
|
|
67
|
+
## 默认要求
|
|
68
|
+
|
|
69
|
+
- **禁止弧形包边**:Tab、卡片、导航、提示条不使用随容器圆角弯曲的强调色侧边框。默认无侧框;需要选中侧标时使用独立的直竖线,与上下边缘留白,不能沿圆角包住上下边缘。中性容器边框与直线端点小圆角不受影响;完整规则见 `../ui-design/SKILL.md`。
|
|
70
|
+
- Web `MciModal` 默认将焦点移入弹窗、约束 Tab、支持 Esc、关闭恢复原焦点并隔离背后页面;多层弹窗只允许最上层交互。桌面标题栏默认可拖动且不能拖出视口,使用 `draggable=false` 可关闭;`closeOnEscape=false` 只用于确需保持的受控状态,必须保留明确关闭路径。
|
|
71
|
+
- 表单提交按钮使用 `MciButton type="submit"`(可配原生 `form` 属性);`MciFormField required` 必须真实触发原生必填验证。自定义 `select`/控件插槽需提供与可见标签一致的 `aria-label` 或 `aria-labelledby`,不能将全部选项文字混入控件名称。
|
|
72
|
+
- 链接、描边按钮和强调文字使用 `--mci-text-link`;品牌填充使用 `--mci-color-primary` 与 `--mci-text-on-primary`。暗色卡片必须使用暗色语义渐变,逐配色核对背景与文字的组合;普通文字和按钮文字对比度至少 4.5:1。
|
|
68
73
|
|
|
69
74
|
- 应用启动时调用 `initMciDesign()`,或提供等效的项目级主题服务。
|
|
70
75
|
- 支持 `theme: light | dark`、`palette: black | white | red | orange | yellow | green | cyan | blue | purple`、`shape: rounded | flat`、`motion: full | reduced`。
|