@microi.net/cli 5.8.5 → 5.8.7

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.
Files changed (208) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/LICENSE +21 -21
  7. package/README.md +71 -71
  8. package/assets/build-meta.json +7 -7
  9. package/assets/feature-matrix.json +138 -138
  10. package/assets/logo.svg +4 -4
  11. package/cordis.patch.yml +1 -1
  12. package/package.json +1 -1
  13. package/scripts/mcp-codex-stdio-adapter.js +0 -0
  14. package/scripts/mcp-server.js +1 -1
  15. package/scripts/microi-cli.js +66 -65
  16. package/scripts/microi-codex-broker.js +450 -450
  17. package/scripts/microi-codex-router.js +618 -618
  18. package/scripts/microi-skills.meta.json +384 -384
  19. package/skills/.microi-skills-version.json +2 -2
  20. package/skills/.progressive-disclosure-manifest.json +21 -21
  21. package/skills/README.md +287 -287
  22. package/skills/ai-engine/SKILL.md +269 -265
  23. package/skills/ai-engine/agents/openai.yaml +4 -4
  24. package/skills/ai-engine/references/ai-employees.md +48 -48
  25. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  26. package/skills/ai-platform-governance/SKILL.md +177 -177
  27. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  28. package/skills/app-store/SKILL.md +525 -525
  29. package/skills/app-store/agents/openai.yaml +4 -4
  30. package/skills/business-blueprint/SKILL.md +193 -193
  31. package/skills/datasource-engine/SKILL.md +93 -93
  32. package/skills/datasource-engine/agents/openai.yaml +4 -4
  33. package/skills/dos-orm/SKILL.md +97 -95
  34. package/skills/dos-orm/references/api-reference.md +229 -229
  35. package/skills/email-engine/SKILL.md +81 -81
  36. package/skills/email-engine/references/v8-email.md +34 -34
  37. package/skills/job-engine/SKILL.md +176 -176
  38. package/skills/job-engine/agents/openai.yaml +4 -4
  39. package/skills/message-notification/SKILL.md +156 -156
  40. package/skills/message-notification/agents/openai.yaml +5 -5
  41. package/skills/message-notification/references/contracts.md +102 -102
  42. package/skills/microi/SKILL.md +14 -14
  43. package/skills/microi-ai-app-auth.js +652 -652
  44. package/skills/microi-ai-application/SKILL.md +115 -115
  45. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  46. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  47. package/skills/microi-client-frontend/SKILL.md +246 -244
  48. 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 +144 -144
  49. 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 +196 -196
  50. 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 +167 -167
  51. package/skills/microi-codex/SKILL.md +102 -100
  52. package/skills/microi-codex-installer/SKILL.md +231 -231
  53. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  54. package/skills/microi-datasource-mapping/SKILL.md +122 -122
  55. package/skills/microi-db-schema/SKILL.md +175 -175
  56. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  57. package/skills/microi-db-schema/references/core-tables.md +695 -695
  58. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  59. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  60. package/skills/microi-db-schema/references/schema.md +646 -646
  61. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  62. package/skills/microi-deployment/SKILL.md +222 -220
  63. package/skills/microi-deployment/references/deployment-matrix.md +109 -109
  64. package/skills/microi-docs-coverage/SKILL.md +133 -133
  65. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  66. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  67. package/skills/microi-form-engine/SKILL.md +333 -333
  68. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  69. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  70. package/skills/microi-form-layout/SKILL.md +205 -205
  71. 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
  72. package/skills/microi-frontend-sdk/SKILL.md +194 -194
  73. 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 +176 -176
  74. package/skills/microi-left-right-layout/SKILL.md +141 -141
  75. package/skills/microi-microservice/SKILL.md +328 -326
  76. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  77. package/skills/microi-mobile-app-quality/SKILL.md +185 -185
  78. 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
  79. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +128 -128
  80. package/skills/microi-solution-quotation/SKILL.md +78 -78
  81. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  82. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  83. package/skills/microi-sso/SKILL.md +96 -90
  84. package/skills/microi-sso/references/acceptance.md +49 -49
  85. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  86. package/skills/microi-sso/references/inbound.md +53 -53
  87. package/skills/microi-sso/references/outbound.md +39 -39
  88. package/skills/microi-system-delivery/SKILL.md +137 -137
  89. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +193 -193
  90. 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 +217 -217
  91. package/skills/microi-ui/SKILL.md +192 -192
  92. package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -183
  93. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  94. 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 +225 -225
  95. 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 +154 -154
  96. package/skills/microi.v8.js +1921 -1921
  97. package/skills/module-engine/SKILL.md +255 -255
  98. package/skills/module-engine/references/module-config.md +204 -204
  99. package/skills/ocr-engine/SKILL.md +113 -113
  100. package/skills/ocr-engine/agents/openai.yaml +4 -4
  101. package/skills/page-engine/SKILL.md +206 -206
  102. package/skills/page-engine/examples/compact-dashboard.json +1444 -1444
  103. 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 +234 -234
  104. 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 +60 -60
  105. package/skills/performance-testing/SKILL.md +221 -221
  106. package/skills/playwright-e2e/SKILL.md +196 -196
  107. 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 +173 -173
  108. 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 +183 -183
  109. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  110. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  111. package/skills/print-engine/SKILL.md +259 -259
  112. package/skills/production-readonly-audit/SKILL.md +41 -41
  113. package/skills/report-engine/SKILL.md +71 -71
  114. package/skills/report-engine/agents/openai.yaml +4 -4
  115. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  116. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  117. package/skills/scripts/sync-embedded-skills.mjs +46 -46
  118. package/skills/scripts/validate-progressive-disclosure.mjs +57 -57
  119. package/skills/search-engine/SKILL.md +75 -75
  120. package/skills/search-engine/agents/openai.yaml +4 -4
  121. package/skills/spider-engine/SKILL.md +190 -190
  122. package/skills/system-observability/SKILL.md +249 -246
  123. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  124. package/skills/translate-engine/SKILL.md +140 -140
  125. package/skills/translate-engine/agents/openai.yaml +4 -4
  126. package/skills/ui-design/SKILL.md +223 -223
  127. package/skills/ui-design/assets/pattern-showcase/app.js +54 -54
  128. package/skills/ui-design/assets/pattern-showcase/index.html +163 -163
  129. package/skills/ui-design/assets/pattern-showcase/styles.css +311 -311
  130. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  131. package/skills/ui-design/references/design-pattern-library.md +184 -184
  132. package/skills/ui-design/references/mci-design-contract.md +163 -163
  133. package/skills/ui-design/references/motion-and-media.md +78 -78
  134. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  135. package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -218
  136. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +164 -164
  137. package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -235
  138. package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -152
  139. package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -238
  140. package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -194
  141. package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -207
  142. package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +142 -142
  143. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  144. package/skills/unity-integration/SKILL.md +171 -171
  145. package/skills/unity-integration/agents/openai.yaml +4 -4
  146. package/skills/unity-integration/references/ai-app-delivery.md +119 -119
  147. package/skills/unity-integration/references/sdk-api.md +82 -82
  148. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  149. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  150. package/skills/v8-api-config/SKILL.md +388 -388
  151. package/skills/v8-cache-pattern/SKILL.md +312 -312
  152. package/skills/v8-crud-api/SKILL.md +178 -178
  153. 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 +226 -226
  154. package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -49
  155. package/skills/v8-debugging/SKILL.md +284 -284
  156. package/skills/v8-explorer-tree/SKILL.md +228 -228
  157. package/skills/v8-export-import/SKILL.md +219 -219
  158. 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 +211 -211
  159. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  160. 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 +42 -42
  161. package/skills/v8-file-upload/SKILL.md +284 -284
  162. 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 +263 -263
  163. 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 +161 -161
  164. package/skills/v8-formengine-http/SKILL.md +238 -238
  165. package/skills/v8-frontend-events/SKILL.md +180 -180
  166. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  167. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  168. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  169. package/skills/v8-http-integration/SKILL.md +182 -182
  170. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  171. 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 +44 -44
  172. package/skills/v8-image-processing/SKILL.md +190 -190
  173. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  174. package/skills/v8-image-processing/references/api-reference.md +623 -623
  175. package/skills/v8-menu-buttons/SKILL.md +186 -186
  176. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +222 -222
  177. 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
  178. 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 +104 -104
  179. package/skills/v8-mongodb/SKILL.md +200 -200
  180. package/skills/v8-mq-mqtt/SKILL.md +176 -176
  181. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  182. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  183. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  184. package/skills/v8-saas-multi-tenant/SKILL.md +305 -305
  185. package/skills/v8-security/SKILL.md +210 -210
  186. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +200 -200
  187. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +160 -160
  188. package/skills/v8-sql-query/SKILL.md +302 -302
  189. package/skills/v8-table-event/SKILL.md +176 -176
  190. 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 +216 -216
  191. 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 +46 -46
  192. package/skills/v8-tcp-integration/SKILL.md +147 -147
  193. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  194. package/skills/v8-template-engine/SKILL.md +167 -167
  195. package/skills/v8-utilities/SKILL.md +104 -104
  196. package/skills/v8-utilities/references/client-api-index.md +143 -143
  197. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  198. package/skills/v8-utilities/references/server-api-index.md +188 -188
  199. package/skills/v8-workflow/SKILL.md +252 -252
  200. package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -180
  201. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  202. package/skills/vision-engine/SKILL.md +160 -160
  203. package/skills/vision-engine/agents/openai.yaml +4 -4
  204. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  205. package/skills/workspace-conventions/SKILL.md +273 -273
  206. 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 +209 -209
  207. 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 +217 -217
  208. 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 +27 -27
@@ -1,92 +1,98 @@
1
- ---
2
- name: microi-sso
3
- description: 设计、实现、配置、迁移、发布和验收 Microi 吾码双向 SSO 身份联邦。用于外部系统通过 OIDC、SAML2、CAS 登录吾码,或吾码作为 OIDC OP、SAML IdP、CAS Server 集成其它系统,以及 diy_sso、账号/角色映射、Secret/证书、官方应用 app.microi.sso 和真实伙伴联调。
4
- ---
5
-
6
- > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
-
8
- # Microi SSO 身份联邦
9
-
10
- ## 何时使用
11
-
12
- 以下任务必须使用本 Skill:
13
-
14
- - Keycloak、Entra ID、ADFS、CAS Server、企业统一身份中心登录吾码。
15
- - 吾码账号登录 ERP、OA、BI、门户或其它第三方系统。
16
- - 修改 `diy_sso`、SSO 登录页、OIDC/SAML/CAS 接口引擎端点、Claim/角色映射或旧 Token SSO。
17
- - 发布、安装、升级或验收官方商城应用 `app.microi.sso`。
18
-
19
- 固定 Gitee、微信、GitHub 登录与 Passkey/TOTP 仍以 `v8-security` 为主;当需求是可配置企业身份联邦时转到本 Skill。
20
-
21
- ## 先读取什么
22
-
23
- 按任务读取,不要一次加载全部参考:
24
-
25
- - 外部身份源登录吾码:读 [references/inbound.md](references/inbound.md)。
26
- - 吾码给第三方提供登录:读 [references/outbound.md](references/outbound.md)。
27
- - 表字段、Secret、证书、安全与存量迁移:读 [references/configuration-and-security.md](references/configuration-and-security.md)。
28
- - 测试、商城发布、目标安装与交付结论:读 [references/acceptance.md](references/acceptance.md)。
29
-
30
- 源码修改前同时完整读取 `workspace-conventions/SKILL.md`;认证、DiyToken、秘密或权限任务再读 `v8-security/SKILL.md`;商城任务再读 `app-store/SKILL.md`。
31
-
32
- ## 不可破坏的事实
33
-
34
- 1. DiyToken 是进入吾码后的唯一平台会话入口。SSO 认证成功后签发 DiyToken,不创建第二套用户/权限 Token。
35
- 2. 吾码向外提供的 OIDC/SAML/CAS 协议票据独立、短期、可撤销,绝不把 DiyToken 给第三方。
36
- 3. `OsClient + ConnectionKey + Subject` 是外部主体隔离边界;所有回调、票据、缓存和审计都绑定租户。
37
- 4. 新连接只用 OIDC、SAML2、CAS;URL Token 是迁移兼容项,不是推荐协议。
38
- 5. Redirect URI、ACS、Destination、Audience 和 CAS service 必须精确匹配;生产端点必须 HTTPS。
39
- 6. Secret/私钥只存 `mci_system_setting` 的受控值;`diy_sso` 只存 Setting Key。匿名接口只返回登录入口白名单投影。
40
- 7. 外部角色、邮箱或昵称不能直接获得管理员权限。默认 `BoundOnly`,JIT 必须显式默认角色、唯一性、回收和审计。
41
- 8. HTTP 200、构建成功、商城任务入队或包可下载都不是完整 SSO 验收。
42
- 9. SSO 公开 HTTP 路由和业务逻辑都必须由接口引擎承载:连接投影、绑定/JIT、角色与 Claim 映射、审计、登录完成、租户扩展以及 OIDC/SAML/CAS 路由不得重新写进 Controller。只有协议编解码、签名验签、Secret/私钥隔离、一次性票据与 DiyToken 等可信原子可以保留在独立 `Microi.SSO` 类库,并且只能由精确官方 Managed Key 调用。
43
- 10. 客户端调用固定应用接口必须优先使用 `/apiengine/{ApiEngineKey}?OsClient=`,让系统日志/监控按真实接口引擎归因;新版宿主即使接口尚未安装也会返回结构化缺失错误。`/api/ApiEngine/Run` 只保留给无法预知 Key 的旧版兼容调用,禁止新增固定业务依赖;同样禁止调用已删除的 `/api/Sso/Capabilities` 等定制路由。
44
-
45
- ## 标准工作流
46
-
47
- ### 存量 TokenLogin 与深链接兼容
48
-
49
- - 已启用且精确配置 `ClientSsoApi=/api/SysUser/TokenLogin` 的旧连接使用平台原生 DiyToken 验证;不能错误过滤掉,也不能改走外部身份源的 `sso_legacy_token_login`。未配置、已停用、任意 URL 或非法 Token 必须继续拒绝。
50
- - SSO 成功后优先保留用户指定的站内深链接及业务参数(如 `ShowClassicLeft/ShowClassicTop`);只有没有指定目标页才采用用户/系统默认首页。菜单/数据权限仍由正常路由守卫与后端校验。
51
- - URL Token 使用后从地址栏和下一次 Router 导航对象同时清除,包括 hash query;单独 `history.replaceState` 不够,动态路由重匹配会把旧 query 带回。验收必须检查 TokenLogin 成功、目标页真实可见、URL 无凭据、布局参数保留;不能仅断言 HTTP 302 或 Code=1。
52
-
53
- 1. 识别方向、协议、租户、身份伙伴、用户生命周期、退出和密钥/证书责任人。
54
- 2. 读取当前 `diy_sso` Schema、菜单、真实连接和已部署 Server/Client 版本;不要从旧截图猜测。
55
- 3. 先选标准协议和安全 profile,再配置字段、Secret/证书 Key、Claim/角色映射。
56
- 4. 先把业务编排写成可随应用发布的接口引擎;仅当现有 V8 无法安全完成底层原子能力时,才扩展最小 `V8.Method`,并把调用权限制到精确官方接口 Key。禁止把整个流程放进新 Controller,也禁止让原子方法接受任意租户、回调地址或 Secret。
57
- 5. 分别验证源码/单测、后端构建、前端构建、运行时端点、浏览器 UI、真实伙伴和多节点。
58
- 6. 平台级资源通过官方应用包发布;官方源用 `microi_itdos` 更新并发布,普通目标租户走商城安装/升级任务。
1
+ ---
2
+ name: microi-sso
3
+ description: 设计、实现、配置、迁移、发布和验收 Microi 吾码双向 SSO 身份联邦。用于外部系统通过 OIDC、SAML2、CAS 登录吾码,或吾码作为 OIDC OP、SAML IdP、CAS Server 集成其它系统,以及 diy_sso、账号/角色映射、Secret/证书、官方应用 app.microi.sso 和真实伙伴联调。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi SSO 身份联邦
9
+
10
+ ## 何时使用
11
+
12
+ 以下任务必须使用本 Skill:
13
+
14
+ - Keycloak、Entra ID、ADFS、CAS Server、企业统一身份中心登录吾码。
15
+ - 吾码账号登录 ERP、OA、BI、门户或其它第三方系统。
16
+ - 修改 `diy_sso`、SSO 登录页、OIDC/SAML/CAS 接口引擎端点、Claim/角色映射或旧 Token SSO。
17
+ - 发布、安装、升级或验收官方商城应用 `app.microi.sso`。
18
+
19
+ 固定 Gitee、微信、GitHub 登录与 Passkey/TOTP 仍以 `v8-security` 为主;当需求是可配置企业身份联邦时转到本 Skill。
20
+
21
+ ## 先读取什么
22
+
23
+ 按任务读取,不要一次加载全部参考:
24
+
25
+ - 外部身份源登录吾码:读 [references/inbound.md](references/inbound.md)。
26
+ - 吾码给第三方提供登录:读 [references/outbound.md](references/outbound.md)。
27
+ - 表字段、Secret、证书、安全与存量迁移:读 [references/configuration-and-security.md](references/configuration-and-security.md)。
28
+ - 测试、商城发布、目标安装与交付结论:读 [references/acceptance.md](references/acceptance.md)。
29
+
30
+ 源码修改前同时完整读取 `workspace-conventions/SKILL.md`;认证、DiyToken、秘密或权限任务再读 `v8-security/SKILL.md`;商城任务再读 `app-store/SKILL.md`。
31
+
32
+ ## 不可破坏的事实
33
+
34
+ 1. DiyToken 是进入吾码后的唯一平台会话入口。SSO 认证成功后签发 DiyToken,不创建第二套用户/权限 Token。
35
+ 2. 吾码向外提供的 OIDC/SAML/CAS 协议票据独立、短期、可撤销,绝不把 DiyToken 给第三方。
36
+ 3. `OsClient + ConnectionKey + Subject` 是外部主体隔离边界;所有回调、票据、缓存和审计都绑定租户。
37
+ 4. 新连接只用 OIDC、SAML2、CAS;URL Token 是迁移兼容项,不是推荐协议。
38
+ 5. Redirect URI、ACS、Destination、Audience 和 CAS service 必须精确匹配;生产端点必须 HTTPS。
39
+ 6. Secret/私钥只存 `mci_system_setting` 的受控值;`diy_sso` 只存 Setting Key。匿名接口只返回登录入口白名单投影。
40
+ 7. 外部角色、邮箱或昵称不能直接获得管理员权限。默认 `BoundOnly`,JIT 必须显式默认角色、唯一性、回收和审计。
41
+ 8. HTTP 200、构建成功、商城任务入队或包可下载都不是完整 SSO 验收。
42
+ 9. SSO 公开 HTTP 路由和业务逻辑都必须由接口引擎承载:连接投影、绑定/JIT、角色与 Claim 映射、审计、登录完成、租户扩展以及 OIDC/SAML/CAS 路由不得重新写进 Controller。只有协议编解码、签名验签、Secret/私钥隔离、一次性票据与 DiyToken 等可信原子可以保留在独立 `Microi.SSO` 类库,并且只能由精确官方 Managed Key 调用。
43
+ 10. 客户端调用固定应用接口必须优先使用 `/apiengine/{ApiEngineKey}?OsClient=`,让系统日志/监控按真实接口引擎归因;新版宿主即使接口尚未安装也会返回结构化缺失错误。`/api/ApiEngine/Run` 只保留给无法预知 Key 的旧版兼容调用,禁止新增固定业务依赖;同样禁止调用已删除的 `/api/Sso/Capabilities` 等定制路由。
44
+
45
+ ## 标准工作流
46
+
47
+ ### 存量 TokenLogin 与深链接兼容
48
+
49
+ - 已启用且精确配置 `ClientSsoApi=/api/SysUser/TokenLogin` 的旧连接使用平台原生 DiyToken 验证;不能错误过滤掉,也不能改走外部身份源的 `sso_legacy_token_login`。未配置、已停用、任意 URL 或非法 Token 必须继续拒绝。
50
+ - SSO 成功后优先保留用户指定的站内深链接及业务参数(如 `ShowClassicLeft/ShowClassicTop`);只有没有指定目标页才采用用户/系统默认首页。菜单/数据权限仍由正常路由守卫与后端校验。
51
+ - URL Token 使用后从地址栏和下一次 Router 导航对象同时清除,包括 hash query;单独 `history.replaceState` 不够,动态路由重匹配会把旧 query 带回。验收必须检查 TokenLogin 成功、目标页真实可见、URL 无凭据、布局参数保留;不能仅断言 HTTP 302 或 Code=1。
52
+
53
+ 1. 识别方向、协议、租户、身份伙伴、用户生命周期、退出和密钥/证书责任人。
54
+ 2. 读取当前 `diy_sso` Schema、菜单、真实连接和已部署 Server/Client 版本;不要从旧截图猜测。
55
+ 3. 先选标准协议和安全 profile,再配置字段、Secret/证书 Key、Claim/角色映射。
56
+ 4. 先把业务编排写成可随应用发布的接口引擎;仅当现有 V8 无法安全完成底层原子能力时,才扩展最小 `V8.Method`,并把调用权限制到精确官方接口 Key。禁止把整个流程放进新 Controller,也禁止让原子方法接受任意租户、回调地址或 Secret。
57
+ 5. 分别验证源码/单测、后端构建、前端构建、运行时端点、浏览器 UI、真实伙伴和多节点。
58
+ 6. 平台级资源通过官方应用包发布;官方源用 `microi_itdos` 更新并发布,普通目标租户走商城安装/升级任务。
59
59
  7. 最终明确已验证与未验证边界,尤其是“配置包已发布”与“运行时代码已部署”的区别。
60
60
 
61
- ## 官方应用合同
62
-
63
- - AppId:`app.microi.sso`
64
- - 名称:`SSO 身份联邦`
65
- - 资源:`diy_sso`、`/system/sso`、字段/布局/视图、34 个 Managed 核心接口引擎和 1 个 CreateIfMissing 租户 Hook;其中 24 个 `sso_http_*` 接管原 SSO Controller 的全部公开路由,不发布用户绑定、连接实例、Secret、证书或示例账号。
66
- - `ResourcePolicies.ApiEngines` 必须逐 Key 显式声明。核心使用 `Managed/Platform`;`sso_event_hook` 使用 `CreateIfMissing/Tenant`,安装后永不被官方覆盖。
67
- - 官方 `iTdos` 是发布源,保护性拒绝安装属于正确行为;普通租户安装才必须轮询到 `Succeeded`。
68
-
69
- ## C# 与接口引擎责任线
70
-
71
- 接口引擎固定承载:
72
-
73
- - `sso_capabilities`、`sso_legacy_capabilities` 的匿名白名单投影;
74
- - `sso_connection_runtime`、`sso_user_runtime` 的内部最小投影;
75
- - `sso_resolve_federated_identity` 的绑定、JIT 与角色映射;
76
- - `sso_outbound_claims`、`sso_protocol_event`、`sso_event_hook`;
77
- - `sso_complete_login`、`sso_rotate_client_secret`、`sso_legacy_token_login` 的业务编排。
78
- - 24 个 `sso_http_*` Managed 端点:`/api/Sso/Begin`、`/api/Sso/CompleteAuthorization`、OIDC 回调/Discovery/JWKS/Authorize/Token/UserInfo/Introspect/Revoke/Logout、CAS 回调/Login/Validate/Logout、SAML Begin/ACS/Login/Complete/Metadata/Logout。
79
- - 历史兼容路由 `/api/Sso/CompleteLogin`、`/api/Sso/LegacyCapabilities`、`/api/Sso/RotateClientSecret` 和 `/api/Sso/SamlBegin` 只用于识别旧客户端并返回受控兼容结果;新宿主优先使用上面的接口引擎地址,不能因旧路由存在而恢复通用 SSO Controller。
80
-
81
- C# 只保留:
82
-
83
- - `Microi.SSO` 的 `SsoProtocolRuntime` 中 OIDC/SAML/CAS 报文编解码、签名验签和协议响应构造;该类型不是 MVC Controller、没有 Route/Http 特性,不直接拥有公开地址;
84
- - Secret、私钥、证书和协议 Token 的可信隔离;
85
- - 高熵一次性 code/ticket、重放保护和 DiyToken 签发;
86
- - 仅允许精确 Managed Key 调用的 `RunSsoProtocol`、`CreateFederatedUser`、`CreateSsoLoginTicket`、`CompleteSsoLogin`、`RotateSsoClientSecret` 原子。
87
-
88
- 公开协议路由使用 `ApiAddress`(包括 `{OsClient}`、`{ConnectionKey}` 路径模板)和 `ResponseType=HTTP`。接口引擎可以返回状态码、Content-Type、XML/纯文本、重定向和安全响应头;`Set-Cookie` 等高风险响应头只能来自 `RunSsoProtocol` 签名的可信响应。不得因为协议需要原始 HTTP 而恢复任何 `Sso*Controller`。
89
-
90
- 新增 SSO 需求先判断是否只需修改上述接口引擎。只有缺少不可伪造、不可泄露的底层原子时才增加 V8 方法;增加后同时更新应用 `RequiredPlatformCapabilities`、后端文档、测试与最低版本。
91
-
92
- 详细用户文档:`microi.doc/docs/doc/more/sso.md`。
61
+ ### 签名异常排查
62
+
63
+ - 先区分 DiyToken 的 HS256、OIDC 的 RS256、SAML XML 签名和接口引擎 HTTP 响应内部签名,保留脱敏异常类型、TraceId、运行版本与失败请求顺序;截图中的“签名异常”不能直接判定为密钥错误。
64
+ - OIDC 第一次成功、第二次登录或退出失败且异常链包含已释放 RSA 时,检查请求级 RSA 与 IdentityModel 缓存签名器的生命周期。平台请求密钥统一使用 `SsoSecurity.CreateRequestScopedRsaKey`,禁用该密钥的签名器缓存;不能修改全局 `CryptoProviderFactory.Default`、取消验签、轮换 `AuthSecret` 或删除租户证书来掩盖错误。
65
+ - 回归须用实际发布依赖重复加载同一私钥,先复现旧缓存路径失败,再验证连续/并发签名、旧 `id_token_hint` 验签和篡改/错误密钥/issuer/audience 拒绝。后端原子修复没有声明式资源变化时,无需为空升版官方 SSO 应用,但必须独立核对后端渠道与客户部署边界。
66
+
67
+ ## 官方应用合同
68
+
69
+ - AppId:`app.microi.sso`
70
+ - 名称:`SSO 身份联邦`
71
+ - 资源:`diy_sso`、`/system/sso`、字段/布局/视图、34 个 Managed 核心接口引擎和 1 个 CreateIfMissing 租户 Hook;其中 24 个 `sso_http_*` 接管原 SSO Controller 的全部公开路由,不发布用户绑定、连接实例、Secret、证书或示例账号。
72
+ - `ResourcePolicies.ApiEngines` 必须逐 Key 显式声明。核心使用 `Managed/Platform`;`sso_event_hook` 使用 `CreateIfMissing/Tenant`,安装后永不被官方覆盖。
73
+ - 官方 `iTdos` 是发布源,保护性拒绝安装属于正确行为;普通租户安装才必须轮询到 `Succeeded`。
74
+
75
+ ## C# 与接口引擎责任线
76
+
77
+ 接口引擎固定承载:
78
+
79
+ - `sso_capabilities`、`sso_legacy_capabilities` 的匿名白名单投影;
80
+ - `sso_connection_runtime`、`sso_user_runtime` 的内部最小投影;
81
+ - `sso_resolve_federated_identity` 的绑定、JIT 与角色映射;
82
+ - `sso_outbound_claims`、`sso_protocol_event`、`sso_event_hook`;
83
+ - `sso_complete_login`、`sso_rotate_client_secret`、`sso_legacy_token_login` 的业务编排。
84
+ - 24 个 `sso_http_*` Managed 端点:`/api/Sso/Begin`、`/api/Sso/CompleteAuthorization`、OIDC 回调/Discovery/JWKS/Authorize/Token/UserInfo/Introspect/Revoke/Logout、CAS 回调/Login/Validate/Logout、SAML Begin/ACS/Login/Complete/Metadata/Logout。
85
+ - 历史兼容路由 `/api/Sso/CompleteLogin`、`/api/Sso/LegacyCapabilities`、`/api/Sso/RotateClientSecret` 和 `/api/Sso/SamlBegin` 只用于识别旧客户端并返回受控兼容结果;新宿主优先使用上面的接口引擎地址,不能因旧路由存在而恢复通用 SSO Controller。
86
+
87
+ C# 只保留:
88
+
89
+ - `Microi.SSO` 的 `SsoProtocolRuntime` 中 OIDC/SAML/CAS 报文编解码、签名验签和协议响应构造;该类型不是 MVC Controller、没有 Route/Http 特性,不直接拥有公开地址;
90
+ - Secret、私钥、证书和协议 Token 的可信隔离;
91
+ - 高熵一次性 code/ticket、重放保护和 DiyToken 签发;
92
+ - 仅允许精确 Managed Key 调用的 `RunSsoProtocol`、`CreateFederatedUser`、`CreateSsoLoginTicket`、`CompleteSsoLogin`、`RotateSsoClientSecret` 原子。
93
+
94
+ 公开协议路由使用 `ApiAddress`(包括 `{OsClient}`、`{ConnectionKey}` 路径模板)和 `ResponseType=HTTP`。接口引擎可以返回状态码、Content-Type、XML/纯文本、重定向和安全响应头;`Set-Cookie` 等高风险响应头只能来自 `RunSsoProtocol` 签名的可信响应。不得因为协议需要原始 HTTP 而恢复任何 `Sso*Controller`。
95
+
96
+ 新增 SSO 需求先判断是否只需修改上述接口引擎。只有缺少不可伪造、不可泄露的底层原子时才增加 V8 方法;增加后同时更新应用 `RequiredPlatformCapabilities`、后端文档、测试与最低版本。
97
+
98
+ 详细用户文档:`microi.doc/docs/doc/more/sso.md`。
@@ -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 自动映射为吾码管理员能力。