后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载导读本文基于 doc/adr/0023-separate-authentication-ui-composition-from-security-administration.md 这份已接受Accepted2026-07-24的架构决策记录深入解析 Elsa 3 在外部认证External Authentication能力落地时如何划分 Studio 侧 UI 的职责边界通用登录/登出外壳由Elsa.Studio.Authentication.UI独占Settings 区域只做 UI 组合与导航SSO 单层入口而外部身份链接与会话管理则保留为安全操作并归入 Security 区域。读完本文你将理解三个登录方法贡献契约ILoginMethodCatalog、ILoginMethodComponentProvider、ILoginMethodIconProvider的作用、/settings/sso-connections与/security/*两条导航线的信息架构以及为什么“外部认证包不能成为通用认证外壳或通用 Settings 后端的拥有者”。一、决策背景登录界面与安全状态为何必须分离Elsa 的登录面login surface并非单一来源。本地账号密码、受代理brokered的外部身份提供方以及未来可能加入的更多认证方法都会共享同一个登录/登出外壳而“外部身份链接”External Identity Links和“外部认证会话”External Authentication Sessions操作的是安全状态security state——即某个外部身份与哪个 Elsa User 绑定、当前有哪些活跃的外部登录会话。如果把这两类职责都塞进外部认证包会造成两个后果外部认证包会变成通用 Studio 认证的“事实所有者”任何新的认证方法都必须依赖它破坏模块边界外部认证包会被迫承担一个“通用 Settings 后端”的职责进而引入服务端 Settings 领域模型与持久化 API——这超出了 SSO 连接管理的范畴。因此 ADR-0023 明确了两个决策Elsa.Studio.Authentication.UI拥有通用登录/登出外壳shell与登录方式选择器chooser各认证模块只通过ILoginMethodCatalog、ILoginMethodComponentProvider、ILoginMethodIconProvider三个契约贡献自身能力不拥有外壳。Studio Settings 区域仅承担 UI 组合与导航SSO 连接管理以单层的Settings → SSO出现路由为/settings/sso-connections它不创建服务端 Settings 领域、不引入持久化 API。外部身份链接与外部认证会话仍是安全操作以独立页面归入Security区域。这一边界同样被固化在功能规格的可接受标准中specs/012-external-authentication/spec.md 的 FR-084A 明确要求“Elsa.Studio.Authentication.UIMUST own the generic login/logout shell and contribution contracts. Settings is UI composition/navigation only and introduces no server-side Settings persistence model。”二、职责边界全景五个 Studio 包各司其职根据 specs/012-external-authentication/contracts/studio-contract.md 的包布局外部认证在 Studio 侧的职责被拆成五个包src/modules/ ├── Elsa.Studio.Settings/ ├── Elsa.Studio.Authentication.UI/ ├── Elsa.Studio.ExternalAuthentication/ ├── Elsa.Studio.ExternalAuthentication.BlazorServer/ └── Elsa.Studio.ExternalAuthentication.BlazorWasm/Elsa.Studio.Settings只拥有 UI 组合/导航契约不定义服务端 Settings 实体、通用 Settings 持久化或授权语义。Elsa.Studio.Authentication.UI拥有通用/login与/logout外壳登录方法选择器的布局、可访问性accessibility、安全返回路径safe return paths与错误呈现面向本地、受代理外部及未来认证方法的认证 UI 贡献契约不含提供方特定业务逻辑的通用认证导航。Elsa.Studio.ExternalAuthentication贡献Refit 客户端与 API DTO基于代理broker的登录方法提供方以及对外壳的本地/外部贡献PKCE 请求模型与外部认证专属状态身份提供方连接Identity Provider Connection的列表/编辑器/测试/预览外部身份链接页面与受限的用户选择器基于描述符descriptor驱动的字段渲染器与可选的自定义编辑器注册表Settings 导航贡献Connections与 Security 贡献Links/Sessions通用的代理 token/提供方抽象。其注册方式为services.AddExternalAuthenticationModule(backendApiConfig);关键点在于模块只有在远端能力可用时才注册管理功能永远不替换 Authentication.UI 外壳由被选中的代理宿主包激活其贡献。三、三个登录方法贡献契约不拥有外壳只贡献能力ADR-0023 的核心是“通过契约集成而非拥有外壳”。这三个契约在 studio-contract.md 中定义public interface ILoginMethodCatalog; public interface ILoginMethodComponentProvider; public interface ILoginMethodIconProvider;它们的职责分工是ILoginMethodCatalog提供有序的方法元数据——外壳据此得知有哪些登录方式可用、显示名是什么、优先顺序如何ILoginMethodComponentProvider解析方法特定的 UI——外壳据此渲染每个登录方式自己的按钮/交互组件ILoginMethodIconProvider解析可信的本地图标——防止远程或恶意图标伪造登录选择器。配合 Settings/Security 的导航贡献契约public interface ISettingsNavigationContributor { ValueTask ContributeAsync( SettingsNavigationBuilder builder, CancellationToken cancellationToken default); } public interface ISecurityMenuContributor { ValueTask ContributeAsync( SecurityMenuBuilder builder, CancellationToken cancellationToken default); }它们只添加导航元数据。任何一方都不得替换外壳、创建重复的父级菜单、绕过路由/API 授权或持久化任意的 Settings 数据。换句话说菜单可见性永远不等于授权——这一点在后文的 UI 授权矩阵中会再次强调。这套“贡献契约 外壳所有权分离”模式与后端服务端模块 src/modules/Elsa.ExternalAuthentication/Contracts/ExternalAuthenticationContracts.cs 中IExternalAuthenticationAdapterRegistry、IUnlinkedIdentityPolicyRegistry、IPermissionGrantSourceRegistry、IExternalUserMatcherRegistry等注册表思路一脉相承都是“宿主拥有容器与契约、模块通过注册表贡献实现”的可扩展设计。四、Settings 区域只有 UI 组合与导航没有服务端领域ADR-0023 特别强调SSO 连接管理在 Settings 中出现为单层的Settings → SSO路由为/settings/sso-connections它不创建服务端 Settings 领域也不引入持久化 API。也就是说Settings 菜单只是一个入口容器SSO 连接管理的实际业务与数据完全落在外部认证模块自己的契约与后端 API/external-authentication之下上菜单贡献方ISettingsNavigationContributor只负责“告诉 Settings 区域有一个 SSO 入口”不负责授权、不负责持久化、不负责业务逻辑。这一约束的动机在于如果把 SSO 连接管理做成“Settings 子系统”外部认证包就会被绑定到一个通用 Settings 后端之上导致模块耦合与服务端模型蔓延。保持 Settings 为“UI 组合/导航容器”可以让外部认证模块独立演进——即使未来新增更多 Settings 页面也不影响 SSO 连接管理的边界。五、Security 区域链接与会话仍是安全操作与 SSO 管理不同外部身份链接与外部认证会话操作的是安全状态因此归入Security区域路由为/security/external-identity-links/security/external-authentication-sessions完整的信息架构为Settings └── SSO Security ├── External Identity Links └── External Authentication Sessions连接管理相关路由由 studio-contract.md 给出/settings/sso-connections/settings/sso-connections/new/settings/sso-connections/{connectionId}/security/external-identity-links/security/external-authentication-sessions旧版连接路由别名可以保留给书签链接但生成的导航与文档统一使用/settings/sso-connections。Elsa.Studio.Settings拥有 Settings 导航与ISettingsNavigationContributor外部认证贡献单层 SSO。Elsa.Studio.Security拥有 Security 与ISecurityMenuContributor外部认证贡献链接与能力门控capability-gated的会话页。两个菜单都不授予授权——路由授权与 API 授权必须同时生效。六、登录选择器Chooser工作流外壳的责任所在/login选择器是Elsa.Studio.Authentication.UI的核心资产。根据 studio-contract.md 的“Login Chooser Contribution”一节其流程为解析经过校验的客户端本地returnPath非法值回退为/通过ILoginMethodsApi获取匿名的登录方法列表按确定性顺序渲染所有可用的本地与外部方法对首选方法排序与强调但不自动跳转在发起本地或外部代理流程之前生成 PKCE只保留不透明的客户端事务状态与本地返回路径。呈现层面的安全约束源自 FR-067/FR-084见 spec.md复用BasicLayout、品牌与本地化即使图标加载失败也要渲染可见的方法名只通过本地资产注册表解析可信图标 ID完整的键盘操作、可见焦点、可访问名称与状态/错误播报不渲染提供方 HTML、远程图片、权威机构authority或客户端标识符。对应到服务端匿名发现端点为 DiscoverLoginMethods.cs它只返回方法 key、类型、显示名、可信图标 ID、显示顺序、首选状态与 Elsa 拥有的发起 URL——绝不返回适配器设置、提供方权威、上游客户端 ID、健康状态、密钥或远程图标。七、两种托管宿主同样的外壳不同的会话保护ADR-0023 的决策建立在外部认证模块的两种宿主模型之上见 research.md 第 8 节与 studio-contract.md 的 Host Package 章节BlazorServer机密客户端 / BFF 风格拥有ElsaStudio.ExternalAuthenticationCookie 方案受保护的服务端代理事务状态/authentication/external/callback与/authentication/external/logout-callback后端通道的 code exchange 与刷新面向 API 客户端与 SignalR 的服务端 token 提供方未授权组件重定向到/loginCookie/会话过期与登出。Cookie 要求名称为ElsaStudio.ExternalAuthenticationHttpOnly trueSecure AlwaysSameSite Lax浏览器代码不可读任何 Elsa 或提供方 token有状态变更的 BFF 端点必须启用防伪antiforgery会话生命周期不得超过外部会话。BlazorWasm公有客户端拥有基于浏览器加密的 PKCE verifier/challenge 生成交换前的sessionStorage事务状态回调后删除两个回调路径同上直接公有客户端 code exchange 与刷新默认内存 token 提供方API/SignalR 授权集成重定向到/login的未授权组件。两种宿主使用同一个方法名注册只是重载/程序集不同services.AddExternalAuthenticationBroker(options configuration.GetSection(Authentication:ExternalAuthentication).Bind(options));WebAssembly 不接受任何客户端密钥交换后的持久化浏览器 token 存储必须是显式的部署选择并显示启动/安全警告。八、提供方选择Authentication:Provider与启动期校验宿主读取Authentication:Provider决定启用哪种认证模式studio-contract.md值行为代理选择器ElsaIdentity现有 Elsa 用户名/密码 Studio 认证关闭OpenIdConnect现有直接单提供方 OpenID Connect关闭ElsaLogin现有遗留登录模块关闭ExternalAuthentication新的 Elsa 代理客户端开启Server 保留默认值ElsaIdentityWebAssembly 保留默认值OpenIdConnect。代理模式是显式选择加入opt-in。启动失败的情形包括Provider ExternalAuthentication但缺少代理客户端 ID/回调在 Server 上注册公有客户端或在 WebAssembly 上注册机密密钥代理模式下同时启用了直接 OpenID Connect 处理器回调/登出回调/浏览器源与 Authentication Client 注册不一致。直接设置保持原样以支持回滚——这正对应规格 FR-104/FR-105直接 OIDC 在整个 Elsa 3.x 保持可用两种模式互斥。九、UI 授权矩阵菜单可见性不等于权限外部认证的管理界面遵循严格的权限门控studio-contract.md 的 UI Authorization Matrix能力UI 行为Read only显示列表/详情无变更按钮Create显示 NewUpdate编辑数据库行启用/禁用密钥绑定操作Archive归档/恢复Test测试按钮Preview预览按钮Policy manage策略/授权编辑器Unsafe provider trust带警告/确认的不安全控件Link manage链接页面与变更Session read/revoke会话区块与撤销路由授权与 API 授权两者都必须满足菜单可见性本身不授予任何权限。这与 ADR-0023“Settings/Security 菜单只做组合与导航”的决定互为表里导航只是入口安全边界永远由服务端与路由授权执行。十、连接列表/编辑器的边界行为Settings → SSO 的实际内容SSO 连接管理页面位于 Settings 下本身也体现了“组合与安全分离”列表服务端分页可按搜索、来源、适配器类型、启用意图、有效性、覆盖/遮蔽状态、归档状态过滤列显示显示名/键、记录 ID、来源/覆盖关系、适配器、启用意图、有效性、最近按需测试含时间戳/修订/过期标记、首选状态与修订。配置拥有的行只读仅在授权时提供Create Studio Override覆盖行明确标识配置基线且不做字段合并。停用的覆盖继续遮蔽配置归档的覆盖揭示配置恢复则重新遮蔽。保存使用If-Match412冲突时保留未保存值、加载当前安全模型并提供重载或手动重新应用——绝不静默覆盖。这些行为直接呼应 ADR-0023 中“SSO 连接管理出现在 Settings 但不创建服务端 Settings 领域”的边界管理页的复杂性被完整地收敛在外部认证模块自身Settings 只负责把它放到正确的位置。十一、验证与测试边界的质量保障studio-contract.md 的 Studio Verification 一节给出了三层验证单元测试描述符表单映射、安全密钥状态、菜单贡献、授权暗示、首选排序无自动跳转、图标回退、返回路径校验、ETag 恢复、过期测试标签服务端集成测试受保护事务状态、回调、后端通道交换、Cookie 标志、仅服务端 token、刷新、登出、API/SignalR token 附加、冲突的启动模式浏览器测试WebAssembly 重定向往返、PKCE、精确源 CORS、无客户端密钥、事务清理、重载后内存 token 丢失、选择器可访问性。此外跨仓库测试用同一个假提供方fake provider与 Core broker fixture 同时跑两种 Studio 宿主。这些测试共同确保外壳的通用性不绑定具体提供方、Settings/Security 导航贡献的纯粹性不加业务逻辑、以及安全边界不被 UI 绕过。十二、总结这套边界设计带来的可演进性ADR-0023 用“外壳所有权”与“菜单贡献”两个维度划清了外部认证在 Studio 中的位置登录外壳是共享资产本地、受代理外部与未来认证方法共享Elsa.Studio.Authentication.UI的/login、/logout与选择器通过三个ILoginMethod*契约接入新方法无需改造外壳Settings 只是容器SSO 连接管理以单层 Settings → SSO 出现但 Settings 本身没有服务端领域与持久化连接管理完整地留在外部认证模块内部安全状态归 Security外部身份链接与会话管理是安全操作与“UI 组合”严格分离且始终受路由 API 双重授权约束。这种分离让Elsa.Studio.ExternalAuthentication不会退化为“通用认证外壳”或“通用 Settings 后端”也让 Elsa 3 在支持多提供方代理登录的同时保持各模块职责单一、可独立安装与演进。相关的配套决策可进一步参考 ADR-0018Separate provider trust from broker invariants 与 ADR-0024Use exact OIDC discovery and deployment-derived callbacks完整的部署示例见 External Authentication Quickstart。赞分享后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载相关推荐Elsa Core 合并树中的 Studio 限定政策src/studio/AGENTS.md 的职责边界与验证指南Elsa Core 合并树中的 Studio 限定政策 src/studio/AGENTS.md 的职责边界与验证指南 在 Elsa Core 仓库将 Els后端工作流自动化流程编排低代码Kubernetes Community 中的 SIG Auth认证、授权与安全策略 SIG 的组织结构与职责全景Kubernetes Community 中的 SIG Auth认证、授权与安全策略 SIG 的组织结构与职责全景 本文以 sig auth/README.m开源治理文档研发协作小米 Home Assistant 集成更新后浴霸模式控制消失5 步找回小米 Home Assistant 集成更新后浴霸模式控制消失5 步找回 小米 Home Assistant 集成更新到 0.2.1 版本后部分用户发现浴霸后端工作流自动化流程编排低代码上一篇浏览器直传革命这款工具如何颠覆传统文件共享下一篇SpringBoot-Scan终极SpringBoot渗透框架一键检测10高危漏洞创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考