尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Elsa 通过部署式描述符提供程序扩展外部认证:协议适配器、连接注册表与无密钥 Broker 架构

发布时间:2026/9/29 4:03:09

资讯中心
01
ARTICLE

Elsa 通过部署式描述符提供程序扩展外部认证:协议适配器、连接注册表与无密钥 Broker 架构

Elsa 通过部署式描述符提供程序扩展外部认证:协议适配器、连接注册表与无密钥 Broker 架构
后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载导读本文以 doc/adr/0016-extend-authentication-through-deployed-descriptor-providers.md 为骨架结合 specs/012-external-authentication、quickstart、runtime-contracts 与 src/modules/Elsa.ExternalAuthentication 源码系统讲解 Elsa 如何在 .NET 工作流引擎内构建服务器拥有的外部登录 Broker部署时注册的可信扩展协议适配器、未链接身份策略、权限授予源通过描述符驱动 Studio 动态表单连接数据采用协议中立信封承载适配器自有 JSON 设置与 Secret Binding配置改动无需数据库 schema 变更、无需重启即可生效。读完本文你将掌握扩展点契约、描述符模型、连接注册表组成规则、Secret Binding 解析与多节点部署要点并能在自己的 Elsa 主机上落地 OpenID Connect 连接的配置与迁移。1. 架构决策背景为什么需要部署式描述符提供程序在 Elsa 3 中外部认证的目标不是简单再挂接一个 OIDC 中间件而是由Elsa Server 拥有完整登录链路发现、授权跳转、回调、密钥使用、身份解析、权限解析与 Elsa 凭据签发。ADR-0016 把这一目标与可扩展性绑定在一起确立了三类关键部署资产可信协议适配器Trusted Protocol Adapters理解具体上游协议如 OpenID Connect被 Elsa 启动时注册未链接身份策略Unlinked Identity Policies决定外部身份尚未链接到任何 Elsa User时如何处理安全默认拒绝权限授予源Permission Grant Sources决定外部身份可以承载哪些 Elsa 权限唯一路径是 Elsa Roles 展开详见 src/modules/Elsa.ExternalAuthentication/Permissions 下的elsa-roles、claim-mapping、group-mapping、claim-pass-through等内置源。这三类扩展都是部署时注册的代码services.AddOpenIdConnectExternalAuthentication()之类而选中的实例 版本化设置是运行时连接数据。两者分层后就出现 ADR-0016 的核心结论新增扩展代码可能需要部署与重启但已安装提供程序的配置变更可实时生效且无需数据库 schema 变更。配置变更实时生效的关键是连接数据采用协议中立信封protocol-neutral envelope 适配器自有 JSON 设置 Secret Binding的存储模型配合描述符驱动 Studio 渲染标准表单。下文逐层拆解。2. 三类部署式扩展及其描述符模型2.1 协议适配器Protocol Adapter源码中的契约定义在 src/modules/Elsa.ExternalAuthentication/Contracts/ExternalAuthenticationContracts.cspublic interface IExternalAuthenticationAdapter { string Type { get; } ExternalAuthenticationAdapterDescriptor Describe(); ValueTaskConnectionValidationResult ValidateAsync( ConnectionValidationContext context, CancellationToken cancellationToken default); ValueTaskExternalAuthorizationRequest CreateAuthorizationRequestAsync( ExternalAuthorizationContext context, CancellationToken cancellationToken default); ValueTaskExternalAuthenticationResult AuthenticateCallbackAsync( ExternalCallbackContext context, CancellationToken cancellationToken default); ValueTaskConnectionTestResult TestAsync( ConnectionTestContext context, CancellationToken cancellationToken default); ValueTaskExternalLogoutRequest? CreateLogoutRequestAsync( ExternalLogoutContext context, CancellationToken cancellationToken default); }要点适配器实例在启动时注册运行时按稳定Type选择注册表实现为 DefaultExternalAuthenticationAdapterRegistry.cs通过IExternalAuthenticationAdapterRegistry暴露ListDescriptors()与TryGet(type, out adapter)。上下文ConnectionValidationContext、ExternalCallbackContext等只提供不可变的连接快照、临时解析出的密钥、受保护适配器状态、出站 HTTP 策略与时钟不暴露持久化服务或任意管理 API——这正是运行时连接数据与部署代码边界在源码层面的落实。设置以JsonElement schema 版本传入解析、校验、迁移全部由适配器自己负责AdapterSettingsMigrationService见 AdapterSettingsMigrationService.cs。ExternalAuthenticationResult只含归一化身份与有界的投影声明绝不让 provider token 进入 Broker 响应或持久化层。2.2 未链接身份策略Unlinked Identity Policypublic interface IUnlinkedIdentityPolicy { string Type { get; } UnlinkedIdentityPolicyDescriptor Describe(); ValueTaskUnlinkedIdentityDecision EvaluateAsync( UnlinkedIdentityContext context, CancellationToken cancellationToken default); }内置三种实现见 src/modules/Elsa.ExternalAuthentication/Policies类型行为reject安全默认拒绝未链接身份RejectUnlinkedIdentityPolicy.cscreate-userJIT 创建无凭据 Elsa User仅授予授权的静态defaultRoleIdsCreateUserUnlinkedIdentityPolicy.csmatch-external-user选择一个部署的IExternalUserMatcher单匹配链接现有用户无匹配走Reject/CreateUser兜底MatchExternalUserUnlinkedIdentityPolicy.cs注意边界matcher 永不选择或变更角色/权限v1 不提供 Elsa 第一方 verified-email matcherdefaultRoleIds仅在新用户被create-user创建时生效。2.3 权限授予源Permission Grant Sourcepublic interface IPermissionGrantSource { string Type { get; } PermissionGrantSourceDescriptor Describe(); ValueTaskPermissionGrantResult GetGrantsAsync( PermissionGrantContext context, CancellationToken cancellationToken default); }IPermissionGrantResolverDefaultPermissionGrantResolver.cs汇总各源结果再套用部署级PermissionGrantOptions的允许/拒绝清单。内置源包括elsa-roles唯一权威路径、claim-mapping、group-mapping、claim-pass-through。ADR-0016 强调外部声明绝不自动等于 Elsa 权限必须经明确配置的授予源映射或有界处理。2.4 描述符Studio 动态表单的唯一信息源描述符是三类扩展共同的元数据契约源码定义在 src/modules/Elsa.ExternalAuthentication/Models/ExternalAuthenticationDescriptors.cspublic sealed record ExternalAuthenticationAdapterDescriptor( string Type, string DisplayName, string Description, int SettingsVersion, IReadOnlyListSettingFieldDescriptor Fields, ExternalAuthenticationAdapterCapabilities Capabilities, CustomEditorContract? CustomEditor);每个SettingFieldDescriptor携带字段名、显示名、值类型、是否必填、UI 提示、默认值、允许值、校验规则SettingFieldValidation最小/最大长度、正则、是否 Secret Binding 字段、是否不安全unsafe、条件可见性VisibleWhen、帮助文本与脱敏行为。适配器能力用ExternalAuthenticationAdapterCapabilities(SupportsTest, SupportsPreview, SupportsUpstreamLogout)描述。由此Studio 依据描述符渲染通用表单没有适配器专属 Studio 代码也能完整配置可选的CustomEditorContract只是增强体验数据库不需要 provider 专属列或表对应 FR-021设置 schema 演进时适配器提供兼容迁移或明确无效状态对应 FR-017/FR-018。3. 连接注册表配置源 数据库源 显式 Override3.1 一个注册表两种来源ADR-0016 与 ADR-0015其连接键与覆盖语义已被 ADR-0021 部分取代共同确立了一个有效注册表模型public interface IIdentityProviderConnectionSource { string Name { get; } ConnectionSourceOwnership Ownership { get; } ValueTaskConnectionSourceSnapshot GetSnapshotAsync( ConnectionScope scope, CancellationToken cancellationToken default); } public interface IIdentityProviderConnectionRegistry { ValueTaskEffectiveConnectionRegistry GetAsync(string targetTenantId, CancellationToken cancellationToken default); ValueTaskEffectiveIdentityProviderConnection? FindByKeyAsync(string targetTenantId, string key, CancellationToken cancellationToken default); ValueTaskEffectiveIdentityProviderConnection? FindByIdAsync(string targetTenantId, string connectionId, CancellationToken cancellationToken default); }配置源ExternalAuthentication:Connections定义不可变、配置所有的连接由 ConfigurationIdentityProviderConnectionSource.cs 物化数据库源可选持久化管理由EnableDatabaseConnections默认 true控制实现见 DatabaseIdentityProviderConnectionSource.cs碰撞规则配置权威。同一有效键下数据库记录被遮蔽shadowed并在 Studio 中显示为冲突而不是静默覆盖对应 FR-003/FR-006。EffectiveConnectionRegistry同时包含 active、invalid、archived、shadowed 管理条目、共享源版本与有效的 host-wide Login Methods匿名发现与登录发起都实时读取当前源版本read-through而不是依赖可能过期的缓存从而让数据库变更在另一节点上无限期陈旧不可能发生。3.2 记录 ID 与逻辑连接键ADR-0016 沿用了 ADR-0015 确立的双标识稳定记录 IDrecord ID用于管理资源与瞬态 Broker/预览/观察记录不可变逻辑连接键Connection Key用于持久的外部身份链接与长寿命外部认证会话。v1 中 SSO 连接管理是host-wide在连接的 Elsa Server 环境内不持久化/不暴露可编辑的环境目标字段。3.3 显式 Studio Override完整文档替换不做字段合并配置键的数据库记录只能通过显式 override 操作创建普通重复键被拒绝。Override 语义对应 FR-007、FR-010、FR-011完整文档替换配置基线不做字段级合并**禁用Disabled**的 override 继续遮蔽配置**归档Archived**的 override 揭示配置基线**恢复Restore**后重新遮蔽并回到 Disabled 状态。仓库 README 还补充了AllowConfigurationConnectionOverrides启用后管理员可以把一个未归档的遮蔽数据库连接升级为显式 override保留记录、Secret Binding 与生命周期若升级会移除最后一个正常登录路径则被最终登录路径守卫FinalLoginPathGuard.cs拒绝。3.4 生命周期状态机从 specs/012-external-authentication/data-model.mdDraft/Disabled --validate enable-- Enabled Enabled --disable------------------ Disabled Draft/Disabled/Enabled --archive--- Archived Archived --restore----------------- DisabledIsEnabled是管理意图ValidityAssessorIdentityProviderConnectionValidityAssessor.cs评估结构有效性测试观察结果不会改变生命周期状态。无效或未解析的设置永远不能真正启用。三个状态互相独立启用意图、结构有效性、最近一次按需测试结果。4. 协议中立信封与 Secret Binding4.1 连接文档不存密钥连接文档IdentityProviderConnection见>public interface ISecretBindingResolver { string Type { get; } ValueTaskSecretBindingState GetStateAsync(SecretBinding binding, CancellationToken cancellationToken default); ValueTaskResolvedSecretBinding ResolveAsync(SecretBinding binding, CancellationToken cancellationToken default); } public sealed record ResolvedSecretBinding(SensitiveString Value, string GenerationFingerprint);每个绑定声明Managed走 Elsa Secrets生命周期由管理员控制或External内置configuration解析器从标准 .NET 配置读取Studio 中只读所有权{ ownership: external, resolverType: configuration, reference: ExternalAuthentication:Providers:Contoso:ClientSecret, expectedType: text, expectedScope: external-authentication }Managed 版本需安装Elsa.ExternalAuthentication.Secrets桥接包{ ownership: managed, resolverType: elsa-secrets, reference: external-authentication/contoso/client-secret, expectedType: text, expectedScope: external-authentication }关键机制是Generation Fingerprint每次解析产生一个不可逆的、带密钥的指纹指纹参与material revision影响签名中所有状态计算但绝不通过管理/诊断面暴露。密钥轮换导致指纹变化 → 在途回调被拒绝对应 FR-098。SensitiveString刻意避免有意义的ToString()并尽量在析构/清理时清除内存。公开模型只暴露IsConfigured、IsResolvable状态。4.3 出站 HTTP 安全边界运行时可配置的 provider 目标天然是 SSRF 面ProviderEgressOptions 提供安全默认项默认强制 HTTPStrueHTTP 仅限显式开发/不安全策略私有/环回/链路本地/保留/未指定地址拒绝每次 DNS 解析后判定重定向最多 3 次每一跳重新校验禁止降级 HTTPS连接/请求超时10 秒discovery/JWKS 响应上限各 1 MiBtoken/UserInfo 响应上限各 256 KiB可选的AllowedHosts精确主机白名单与ProxyUri部署代理可叠加生效。实现位于 ValidatedOutboundConnectionFactory.cs 与 ProviderHttpClientFactory.cs校验器见 Validation/OutboundDestinationValidator.cs。5. 从启动注册到实时生效配置流与验证流5.1 模块注册services.AddElsa(elsa { elsa.UseIdentity(identity { identity.TokenOptions options { options.SigningKey configuration[Identity:SigningKey]!; options.Issuer https://elsa.example; options.Audience https://elsa.example; }; }); elsa.UseExternalAuthentication(feature { feature.ConfigureOptions options configuration.GetSection(ExternalAuthentication).BindExternalAuthenticationOptions(options); }); }); services.AddOpenIdConnectExternalAuthentication();注意用BindExternalAuthenticationOptions做配置绑定适配器/策略/授予源的设置是任意 JSON 信封需要从配置段重建ExternalAuthenticationConfigurationExtensions.cs。AddExternalAuthenticationServices默认提供内存存储Stores/InMemory适合单节点开发。5.2 多节点前提生产多节点必须启用外部认证 EF 持久化特性如SqliteExternalAuthenticationPersistence共享 Broker 状态、授权授予、会话、观察结果、注册表版本与身份链接共享 ASP.NET Core Data Protection 密钥每个节点配置相同的 handle-hashing 密钥{ ExternalAuthentication: { HandleHashing: { SharedKeyBase64: base64 编码、至少 32 字节的随机值 } } }可用openssl rand -base64 32生成务必走部署密钥/配置提供程序而非源码。轮换该密钥会使在途 Broker 交易失效、改变持久化外部 subject 哈希因此需要显式迁移计划ExternalAuthenticationOptions.cs 中HandleHashing.SharedKeyBase64注释亦说明省略时单节点开发会生成进程本地密钥。5.3 配置实时生效的验证路径配置变更为何无需重启因为连接文档是协议中立信封AdapterSettings是 opaque JSON数据库 schema 无需感知 provider 字段描述符让 Studio 动态渲染表单适配器新增字段不触发 Studio 代码更新注册表read-through读取配置源与数据库源启用/禁用/归档/override 的下一次发现与发起立即反映material revision 机制让在途回调基于权威当前状态判定拒绝对应 FR-038。仓库 README 提供完整 Authentication Client 配置示例其中机密用绑定而非值{ ExternalAuthentication: { AuthenticationClients: [ { clientId: elsa-studio-server, displayName: Elsa Studio Server, clientType: confidential, callbackUris: [https://localhost:7113/authentication/external/callback], logoutCallbackUris: [https://localhost:7113/authentication/external/logout-callback], allowedReturnPathPrefixes: [/], secretBinding: { ownership: external, resolverType: configuration, reference: Secrets:ExternalAuthentication:StudioServerClientSecret }, isEnabled: true } ] }, Secrets: { ExternalAuthentication: { StudioServerClientSecret: development-secret } } }环境变量等价形式为Secrets__ExternalAuthentication__StudioServerClientSecretdeployment-secret。任何标准IConfiguration提供程序环境变量、Kubernetes 挂载配置、云密钥提供程序都能供应该引用值。6. OpenID Connect v2 适配器实战配置6.1 设置契约v1 适配器的当前设置契约版本为 2源码契约见 runtime-contracts.md字段规则见>{ ExternalAuthentication: { Redirects: { ExternalCallbackBaseUri: https://elsa.example/elsa/api/ }, Connections: [ { id: 01JZCONTOSOOIDC000000000001, key: contoso-workforce, adapterType: openid-connect, displayName: Contoso, iconId: building, displayOrder: 10, isPreferred: true, isEnabled: true, adapterSettingsVersion: 2, adapterSettings: { mode: discovery, discoveryUrl: https://login.contoso.example/.well-known/openid-configuration, clientId: elsa-server, scopes: [openid, profile, email, groups], clientAuthenticationMethod: client_secret_basic }, secretBindings: { clientSecret: { ownership: external, resolverType: configuration, reference: ExternalAuthentication:Providers:Contoso:ClientSecret, expectedType: text, expectedScope: external-authentication } }, unlinkedPolicy: { type: create-user, settingsVersion: 1, settings: { defaultRoleIds: [workflow-user] } }, claimProjection: { allowedClaimTypes: [name, email, groups], redactedClaimTypes: [email], maximumClaimCount: 50, maximumValueLength: 2048, maximumTotalBytes: 32768 }, upstreamLogoutMode: userChoice } ], Providers: { Contoso: { ClientSecret: deployment-secret } } } }字段含义id是稳定记录 IDkey是不可变逻辑连接键参与回调推导与身份链接isPreferred只是展示排序/强调永不自动跳转对应 FR-069unlinkedPolicy.type可选部署允许列表内的reject/create-user/match-external-userclaimProjection是归一化声明投影允许类型白名单、脱敏类型、数量与字节上限白名单外的声明被丢弃upstreamLogoutMode取值Disabled/UserChoice/Always默认Disabled。Elsa 从部署外部基址推导回调https://elsa.example/elsa/api/external-authentication/callback/contoso-workforce https://elsa.example/elsa/api/external-authentication/previews/callback/01JZCONTOSOOIDC000000000001第一个用于正常登录按不可变连接键第二个用于管理员预览按稳定记录 ID管理员使用预览时需向 provider 注册这两个精确回调。回调、机密客户端要求、S256 PKCE 与校验步骤不可变discovery 派生的 issuer、授权/令牌端点与签名密钥仅在部署策略允许不安全 provider 信任且调用者持有专门权限时出现在Advanced中。6.3 Studio 配置Server 与 WebAssemblyStudio Server机密客户端BFF 模式{ Authentication: { Provider: ExternalAuthentication, ExternalAuthentication: { ClientId: elsa-studio-server, ClientSecret: {from-secret-configuration}, CallbackPath: /authentication/external/callback, LogoutCallbackPath: /authentication/external/logout-callback } } }builder.Services.AddExternalAuthenticationBroker(options configuration.GetSection(Authentication:ExternalAuthentication).Bind(options)); builder.Services.AddExternalAuthenticationModule(backendApiConfig);浏览器只拿到安全 Studio cookieElsa access/refresh 凭据保留在 Studio Server 认证会话内。Studio WebAssembly公开客户端无 secret、强制 PKCE{ Authentication: { Provider: ExternalAuthentication, ExternalAuthentication: { ClientId: elsa-studio-wasm, CallbackPath: /authentication/external/callback, LogoutCallbackPath: /authentication/external/logout-callback, BrowserStorage: Memory } } }默认内存令牌存储要求刷新后重新登录Session或Durable浏览器存储是显式部署选择且会发出安全警告。6.4 验证 BrokerGET https://elsa.example/elsa/api/external-authentication/login-methods?clientIdelsa-studio-wasm确认contoso-workforce以 preferred 返回且不含discoveryUrl、适配器设置、client ID、测试详情、远程图标或密钥数据打开 Studio/login选择 Contoso 完成认证确认 provider 只重定向到 Elsa 部署派生的连接键回调确认 Elsa 只以不透明完成码 client state 重定向 Studio确认完成码重放失败确认 Elsa access token 携带会话 ID 与 Elsa Roles 产生的权限禁用连接后确认发起、在途回调与外部刷新失败而已签发 access token 按配置到期。7. 启用持久化管理与身份链接7.1 开启持久化启用ProviderExternalAuthenticationPersistenceshell 特性并应用迁移。这与 Identity EF 持久化相互独立只启用ProviderIdentityPersistence时外部认证仍走内存存储。共享持久化的对象包括数据库所有连接与修订、外部身份链接、外部认证会话与轮换刷新状态、Broker 交易与完成授予、最新连接观察。安装Elsa.Studio.Authentication.UI、Elsa.Studio.Settings、Elsa.Studio.ExternalAuthentication后访问/settings/sso-connections外部身份链接与外部认证会话是独立的/security页面。配置连接只能通过显式创建完整 Studio Override 编辑禁用该 override 保持配置基线被遮蔽归档揭示配置恢复继续遮蔽。可创建禁用草稿 → 选 OpenID Connect → 配置字段与 Secret Binding → 校验 → 测试 → 预览 → 启用。7.2 身份链接与 JIT 供给外部身份链接以(targetTenantId, connectionKey, issuer, subjectHash)为唯一键数据库唯一索引与 Elsa User 分离——一个 Elsa User 可拥有多个外部身份也可无本地凭据。无凭据用户不含占位密码材料本地登录失败与无效凭据返回相同结果。JIT 供给通过IExternalIdentityProvisioner.CreateLinkOrGetExistingAsync原子收敛凭证无凭据用户含角色先完成链接存储原子仲裁身份元组失败的写入者补偿其创建的仅该用户对应 FR-054/FR-055。管理员预链接与 JIT 走同一原子服务v1 无终端用户自助链接。7.3 会话与测试观察外部认证会话绝对最大年龄 8 小时Lifetimes.MaximumSessionAge刷新令牌不透明、会话绑定、每次使用轮换、复用触发撤销刷新时重新评估当前 Elsa 用户与角色授予而不重新查询上游声明对应 FR-044。连接观察只存最新脱敏测试结果IConnectionObservationStorematerial revision 变化即标记陈旧无需轮询与历史表。预览独立的短生命周期一次性状态/结果记录绑定管理员、记录 ID、草稿修订与预览回调预览绝不创建用户、链接、完成码或正常会话对应 FR-086/FR-087。可选健康检查显式注册不参与默认 readinessservices.AddExternalAuthenticationHealthCheck();标记为external-authentication与optional。8. 从 Direct Studio OpenID Connect 迁移Direct OIDC 在 Elsa 3.x 全程保持可选兼容模式Brokered 模式为推荐。每个 Studio 主机Authentication:Provider三选一OpenIdConnect、ExternalAuthentication、ElsaIdentity同时配置 Direct 与 Broker 会在启动时报可操作错误而非隐式选择。迁移要点详见 doc/migrations/external-authentication.mdAuthority/MetadataAddress→ 连接的adapterSettings.discoveryUrldiscovery 模式ClientId→ 连接的adapterSettings.clientId上游客户端注册与 Elsa Authentication Client 是两个不同注册ClientSecret→ 连接的secretBindings.clientSecret通过部署密钥配置复制绝不通过 API/UICallbackPath→ Elsa 固定连接键回调SignedOutCallbackPath→ 启用上游登出时的 Elsa 登出回调NameClaimType/RoleClaimType→ 归一化声明投影与显式授予映射上游角色不自动成为 Elsa 权限。安全发布顺序保持OpenIdConnect模式 → 服务器安装外部认证模块 → 添加配置所有连接与 Studio Authentication Client → 注册 Elsa provider 回调暂不删除 Direct 回调→ 独立解析密钥 → 非生产验证 → 仅切换Authentication:Provider并重启 Studio → 按自身轮换计划删除旧 Direct 回调与旧密钥。回滚只需恢复Authentication:Provider为OpenIdConnect并重启——Broker 配置从不改写 Direct 配置或移动其密钥。9. 扩展自己的适配器与策略9.1 自定义扩展注册部署代码注册后即可被运行时选择ExternalAuthenticationOptions的AllowedAdapterTypes、AllowedUnlinkedIdentityPolicyTypes、AllowedExternalUserMatcherTypes、AllowedPermissionGrantSourceTypes控制部署允许列表空集合表示放行所有已安装类型external.AddAdapterMyGitHubAdapter(); external.AddUnlinkedIdentityPolicyMyAdmissionPolicy(); external.AddPermissionGrantSourceMyEntitlementGrantSource(); services.AddSingletonIPermissionDescriptorProvider, MyModulePermissionDescriptors();9.2 扩展必须遵守的不可变不变量适配器结果只输出归一化身份与有界投影声明设置解析/校验/迁移由扩展自己负责schema 版本受描述符约束上下文接口不暴露持久化服务与任意管理 APImatcher 不触碰角色/权限defaultRoleIds保存必须通过IExternalRoleAssignmentAuthorizer授权ExternalRoleAssignmentAuthorizer角色删除须经IRoleDeletionDependencyContributor检查配置源引用只返回脱敏配置路径并阻止删除所有安全相关结果发布类型化、脱敏的INotificationExternalAuthenticationSecurityNotifications.cs。10. 测试与验证命令仓库内置单元、集成与组件测试可直接用于验证扩展行为dotnet test test/unit/Elsa.ExternalAuthentication.UnitTests/Elsa.ExternalAuthentication.UnitTests.csproj dotnet test test/unit/Elsa.Identity.UnitTests/Elsa.Identity.UnitTests.csproj dotnet test test/integration/Elsa.ExternalAuthentication.IntegrationTests/Elsa.ExternalAuthentication.IntegrationTests.csproj dotnet test test/component/Elsa.Workflows.ComponentTests/Elsa.Workflows.ComponentTests.csproj dotnet build Elsa.sln结语ADR-0016 用部署时注册代码 运行时连接数据 描述符驱动 UI三条边界回答了 Elsa 外部认证如何在可扩展的同时保持安全默认与零 schema 变更。协议中立信封让 OpenID Connect 成为第一个适配器而不是唯一形态Secret Binding 用不可逆指纹把密钥轮换转化为可判定的 material revision配置/数据库双源注册表配合显式 Override 保证了所有权的确定性。无论你只是配置一个生产 OIDC 连接还是要以IExternalAuthenticationAdapter落地下一个 provider本仓库的 契约源码、数据模型 与 快速开始 就是最完整的事实依据。赞分享后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载相关推荐Elsa Workflows 外部认证模块架构解析协议中立 Broker、身份解析与原子供给的端口-适配器设计Elsa Workflows 外部认证模块架构解析协议中立 Broker、身份解析与原子供给的端口 适配器设计 Elsa WorkflowsThe Work后端工作流自动化流程编排低代码Paseo Forge 扩展指南深入 Git Forge 注册表、协议与适配器架构Paseo Forge 扩展指南深入 Git Forge 注册表、协议与适配器架构 导读 本文围绕 docs/forge providers.md httpsElsa Core 外部认证迁移指南从 Studio 直连 OpenID Connect 切换到 Elsa BrokerElsa Core 外部认证迁移指南从 Studio 直连 OpenID Connect 切换到 Elsa Broker 本文面向 Elsa 3 部署者与安全后端工作流自动化流程编排低代码创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。