ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Elsa 外部认证数据模型解析:从 Connection 到 Session 的完整信任链设计

Elsa 外部认证数据模型解析:从 Connection 到 Session 的完整信任链设计 后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载导读本文基于 Elsa Core 仓库中的 外部认证数据模型规范系统拆解 Elsa 3 外部认证External Authentication能力背后的完整数据模型包括 Identity Provider Connection 的归属与生命周期、Secret Binding 的密钥解耦、Unlinked Identity Policy 的准入决策、External Identity Link 的身份关联、Broker 事务与完成码的单次使用语义、外部认证会话的轮换与撤销以及连接测试与预览的隔离机制。读完本文你将理解 Elsa 如何把外部身份与Elsa 授权彻底分离并能结合源码与配置示例独立排查连接、链接、会话三类数据的流转与安全边界。设计总览一套数据模型如何承载配置 持久化 运行时三种形态外部认证在 Elsa 中不是简单的登录按钮而是一整套以Identity Provider Connection身份提供方连接为核心的信任关系管理能力。数据模型规范>Draft/Disabled --validate enable-- Enabled Enabled --disable------------------ Disabled Draft/Disabled/Enabled --archive--- Archived Archived --restore----------------- Disabled无效或未解决的配置永远不会真正生效测试观测test observation不改变生命周期状态。对 override 而言Disabled仍遮蔽配置Archived揭示配置restore以Disabled状态恢复遮蔽。MaterialRevision 的指纹化实现MaterialRevision并非随机数而是由 ConnectionRevisionCalculator.cs 计算出的确定性 SHA-256 指纹。它把 tenantId、规范化 key、adapterType、adapterSettingsVersion、adapterSettings、按名排序的 secretBindings、isEnabled、overridesConfigurationConnection、isArchived、upstreamLogoutMode、unlinkedPolicy、permissionGrantSources、claimProjection 全部序列化后取哈希前缀为m-。这也是回调到达时若连接发生实质变更则拒绝流程这一安全语义的底层依据任何影响登录的状态变化都会导致指纹不同从而让 in-flight 流程失效。SecretBinding机密不落库的解耦层SecretBinding是连接文档中唯一的密钥引用而非密钥本身字段类型规则OwnershipenumManaged或ExternalResolverTypestring已安装且部署允许的解析器Referencestring非机密的查找键ExpectedTypestring?可选的解析器/类型约束ExpectedScopestring?可选的解析器/作用域约束解析结果返回瞬时值与不透明、不可逆的 generation 指纹。指纹参与 MaterialRevision 计算但既不暴露也不存储于 API 模型中。Managed 绑定通过 Elsa Secrets 管理生命周期可经授权 API 替换/移除External 绑定使用内置的configuration键解析器或其他部署解析器在 Studio 中仅可读值。源码侧SecretBindingrecordExternalAuthenticationModels.cs声明了ResolverType、Reference、ExpectedType、ExpectedScope、OwnershipConfigurationSecretBindingResolver见 Services 目录负责从 .NET 配置解析 External 值并派生不可逆指纹。PolicySelection 与 MatcherPolicySettings未链接身份的准入决策当一个认证成功的身份没有对应链接时由连接选择的 Unlinked Identity Policy 决定结果PolicySelectionType已安装且部署允许的策略、SettingsVersion正数、Settings策略自有校验/迁移的 JSON。内置类型为Reject、CreateUser以及通用 matcher 策略。MatcherPolicySettingsMatcherType一个已安装且部署允许的IExternalUserMatcher、MatcherSettingsVersion、MatcherSettings、NoMatchActionReject或CreateUser。matcher 描述符声明其所需的规范化 claim 类型这些 claims瞬时供给、评估后即丢弃。单个匹配提议一个既有用户无匹配按NoMatchAction执行结果歧义或错误则拒绝。V1 不内置 Elsa 一方维护的已验证邮箱 matcher。DefaultRoleIds仅在CreateUser实际执行时生效。源码中的三个内置策略位于 Policies 目录RejectUnlinkedIdentityPolicy、CreateUserUnlinkedIdentityPolicy、MatchExternalUserUnlinkedIdentityPolicy与文档完全对应。ClaimProjectionclaims 的限量白名单字段类型规则AllowedClaimTypesset只有这些规范化 claims 能存活于登录处理RedactedClaimTypesset在预览/诊断中隐藏的值MaximumClaimCountint安全有界默认值部署可调低MaximumValueLengthint每个标量/数组成员的上限MaximumTotalBytesint整个规范化投影的上限值只能是字符串或字符串数组每个值在求值期间都携带 adapter/provider 来源。投影之外的 claims 一律丢弃。默认上限在 ExternalAuthenticationOptions.cs 中可查MaximumClaimCount 64、MaximumValueLength 1_024、MaximumTotalBytes 16 KiB且均可在部署配置中调整。ExternalIdentityLink把外部身份钉在Elsa 用户上ExternalIdentityLink将一个提供方身份与一个租户持有的 Elsa User 关联v1 中连接部署保持宿主机级字段类型规则Idstring不可变TenantIdstringBroker 解析出的目标 Elsa 租户ConnectionKeystring不可变逻辑连接键Issuerstring校验后的规范化 issuer 命名空间SubjectHashstring规范化提供方 subject 的键控哈希SubjectHintstring?可选的掩码操作提示绝不是原始 subjectUserIdstring同一目标租户内的 Elsa UserCreatedAtDateTimeOffset创建/预链接时间LastSignedInAtDateTimeOffset?安全运维元数据关键约束唯一索引(TenantId, ConnectionKey, Issuer, SubjectHash)外键指向UserBroker 强制租户相等连接归档保留链接显式解除链接移除活跃关联并发出通知并发 JIT 与预链接使用原子 create-link-or-get-existing操作。持久化实体 PersistedExternalIdentityLink 与文档字段完全一致且按研究决策唯一索引IX_ExternalIdentityLink_Identity仲裁每身份一条链接的不变式。User 迁移支持无本地凭据的用户既有User实体发生如下兼容变更字段变更HashedPassword可空两个密码字段要么同时存在要么同时缺席HashedPasswordSalt可空无凭据用户无法通过遗留或 broker 本地密码校验认证既有密码行无需任何数据迁移。JIT 供应为内部 ElsaUser.Name生成全局唯一值、密码字段留空并在 User 存储写入时分配经授权的默认/matcher 角色。链接存储独立仲裁外部身份元组失败或落败的链接写入者会移除其创建的无凭据 User 后再返回或传播失败。AuthenticationClient注册过的 Elsa 客户端AuthenticationClient是部署配置的 Elsa 客户端注册字段类型规则ClientIdstring唯一不可变标识符DisplayNamestring面向运维人员ClientTypeenumConfidential或PublicCallbackUrisset精确 HTTPS 匹配开发回环可显式允许LogoutCallbackUrisset精确匹配AllowedOriginsset公共客户端必填不允许通配符AllowedReturnPathPrefixesset认证后客户端本地导航的段边界前缀SecretBindingSecretBinding?机密客户端必填公共客户端禁止IsEnabledbool禁用客户端不能发起或交换重要边界Authentication Client不是Elsa API Application不含任何角色或权限。这与其在 ExternalAuthenticationModels.cs 中的独立 record 定义一致。BrokerTransaction短生命周期的一次性关联状态BrokerTransaction保存共享、受保护、短生命周期的提供方/本地/预览关联状态字段类型规则HandleHashstring随机浏览器可见 state handle 的键控哈希PurposeenumExternalSignIn、LocalSignIn、Preview、UpstreamLogoutClientIdstring已注册的 Authentication Client 或预览用途CallbackUriURI精确注册的回调ReturnPathstring校验后的客户端本地路径TenantIdstringBroker 解析出的目标 Elsa 租户ConnectionIdstring?外部/预览流程必需的连接记录 IDConnectionMaterialRevisionstring?捕获的有效修订SecretGenerationFingerprintstring?受保护、不可逆PkceChallengestring仅 S256ProviderNoncestring?外部/预览流程ProtectedPayloadbytes数据保护的 adapter 状态ExpiresAtDateTimeOffset默认 10 分钟ConsumedAtDateTimeOffset?原子单次使用标记EF 持久化还存储规范化的ExpiresAtUtcTicks伴生字段用于与ConsumedAt相同的 compare-and-swap 谓词——因为并非所有受支持的数据库都能直接排序DateTimeOffset。这一点可在 PersistedBrokerTransaction 中直接看到ExpiresAtUtcTicks列。公共 handle 不含受保护负载原子 take 将 pending 转为 consumed过期或不匹配的状态永不复活。AuthorizationGrant单次使用的完成码AuthorizationGrant是单次使用的 Elsa 完成码记录字段类型规则CodeHashstring随机码的键控哈希ClientIdstring绑定的客户端CallbackUriURI绑定的精确回调TenantIdstring绑定的目标 Elsa 租户UserIdstring解析出的 Elsa UserExternalSessionIdstring?broker 本地登录为 nullPkceChallengestringS256ExpiresAtDateTimeOffset默认 60 秒ConsumedAtDateTimeOffset?原子单次使用EF 持久化同样使用ExpiresAtUtcTicks伴生列PersistedAuthorizationGrant。完成码在交换成功或失败后都被原子消费重放返回400 invalid_request。ExternalAuthenticationSession有界的旋转式外部会话ExternalAuthenticationSession是从外部认证建立的完整 Elsa 会话字段类型规则Idstring作为安全会话 claim 进入访问令牌TenantIdstring解析出的目标 Elsa 租户UserIdstringElsa UserConnectionKeystring源逻辑连接ConnectionMaterialRevisionstring完整登录时的修订Issuerstring校验过的 issuerSubjectHashstring无原始 subjectProvisionedRoleIdsJSON array脱敏的 JIT 来源不重新应用到既有用户UpstreamLogoutArtifactprotected bytes?仅当配置的注销需要时的最小 adapter 工件默认绝非 access/refresh tokenStartedAtDateTimeOffset完整外部登录LastRefreshedAtDateTimeOffset轮换时间ExpiresAtDateTimeOffset最大会话年龄默认 8 小时RefreshExpiresAtDateTimeOffset不活动界限CurrentRefreshTokenHashstring?当前不透明令牌的键控哈希首个刷新令牌签发前为空RefreshGenerationlongcompare-and-swap 轮换计数器RevokedAtDateTimeOffset?显式或重用检测撤销RevocationReasonstring?安全类别EF 持久化把可选当前哈希放在一对一ExternalAuthenticationSessionRefreshTokens行中PersistedExternalAuthenticationRefreshToken使未签发状态无需哨兵值。刷新操作原子性地校验当前令牌哈希与 generation、轮换令牌并重新评估当前 Elsa 持有的角色授权——不重新查询上游 claims也不变更用户角色。重用被取代的令牌会撤销整个会话。默认生命周期Broker 事务 10 分钟、完成码 60 秒、预览 10 分钟、会话最长 8 小时在 ExternalAuthenticationLifetimesOptions 中可查。ConnectionObservation 与 PreviewResult可诊断、零副作用的观测层ConnectionObservation只保存最近一次按需测试结果字段类型规则ConnectionIdstring连接记录 ID主键TestedMaterialRevisionstring决定新鲜度ObservedAtDateTimeOffsetUTCStatusenumSucceeded、Failed、WarningCategorystring稳定脱敏类别DurationTimeSpan测试时长Summarystring安全有界消息Warningslist安全有界警告CorrelationIdstring诊断关联当被测修订与当前有效 MaterialRevision 不一致时观测即过期无需历史表。其持久化形态为 PersistedConnectionObservation。PreviewResult是管理员交互式预览的一次性结果字段类型规则HandleHashstring一次性结果 handleAdministratorIdstring发起认证的参与者TenantIdstring预览目标 Elsa 租户ConnectionIdstring草稿连接记录 IDMaterialRevisionstring精确预览修订Issuerstring校验过的 issuerMaskedSubjectstring绝非原始 subjectProjectedClaimsJSON 对象仅白名单 描述符脱敏PolicyDecisionJSON 对象提议的动作无任何变更UserResolutionProjectionJSON 对象提议的匹配/无匹配动作、安全用户提示与静态建用户角色无 matcher claimsWarningslist安全有界警告ExpiresAtDateTimeOffset默认 10 分钟ConsumedAtDateTimeOffset?一次性读取预览结果不能兑换为正常会话不创建用户、链接、正常完成码、Elsa 凭据或正常会话。EF 同样使用ExpiresAtUtcTicks伴生列PersistedPreviewResult。OpenIdConnectAdapterSettings v2首个适配器的设置契约v1 交付的 OIDC adapter 以版本 2 的设置 schema 呈现字段类型规则DiscoveryUrlURI精确绝对 HTTPS discovery 文档 URLClientIdstring机密上游客户端标识符ClientAuthenticationMethodenum序列化为client_secret_basic或client_secret_postScopesset必须包含openid有界且校验AdvancedTrustOverridesJSON object?可选 issuer、authorization/token 端点与签名密钥需权限/部署门控并持久警告回调不存储在 adapter 设置中——Elsa 从部署外部基地址、固定回调路由与转义后的不可变 Connection Key 推导它。Advanced overrides 只替换 discovery 输入不能关闭签名/issuer/audience/lifetime 校验机密客户端模式与提供方 PKCE S256 不可变。quickstartquickstart.md给出了推导结果示例https://elsa.example/elsa/api/external-authentication/callback/contoso-workforce https://elsa.example/elsa/api/external-authentication/previews/callback/01JZCONTOSOOIDC000000000001数据模型如何驱动 REST 契约与运行时安全上述数据模型直接映射到 REST API 契约发现GET /external-authentication/login-methods只返回 method 的 key/kind/displayName/iconId/order/isPreferred/initiationUrl绝不含 adapter 设置、authority、上游 client ID、健康或机密。发起GET /external-authentication/authorize/{connectionKey}携带client_id、精确redirect_uri、S256code_challenge与受白名单约束的return_pathElsa 把关联状态存入BrokerTransaction受保护负载 HandleHash绝不把return_path转发给提供方。回调GET /external-authentication/callback/{connectionKey}用不可变 Connection Key 解析记录 ID回调时校验连接是否仍启用、未归档且 MaterialRevision 未变随后以AuthorizationGrant60 秒、单次使用、绑定 ClientId/CallbackUri/TenantId/UserId/PkceChallenge重定向回客户端。交换POST /external-authentication/token消费完成码机密客户端额外用 HTTP Basic 认证返回 Elsa JWT 旋转式外部刷新令牌refreshToken、refreshExpiresIn、externalSessionExpiresIn。刷新grant_typerefresh_token原子校验CurrentRefreshTokenHash与RefreshGeneration轮换令牌并重评估当前 Elsa 角色授权重用被取代令牌则撤销会话。管理连接列表、创建、更新、启用/禁用、归档/恢复、校验、测试、预览、Secret Binding 替换/移除、链接管理与会话撤销端点均要求专用权限如external-authentication:connections:update、external-authentication:links:manage、external-authentication:sessions:revoke且数据库变更以ETag/If-Match实现乐观并发。快速上手配置优先的一条 OIDC 连接配置优先configuration-first是完整支持的部署形态。核心注册代码quickstart.mdservices.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();多节点生产环境还需启用 External Authentication EF 持久化、共享 ASP.NET Core Data Protection 密钥并为所有节点配置同一把 handle-hashing 密钥至少 32 字节随机值openssl rand -base64 32生成{ ExternalAuthentication: { HandleHashing: { SharedKeyBase64: base64-encoded random value of at least 32 bytes } } }随后注册两个 Authentication Client机密型 Studio Server 与公共型 WebAssembly、一条contoso-workforceOIDC 连接含 External/Managed Secret Binding、create-userUnlinked Policy、claim 投影与userChoice上游注销即可端到端验证发现 → 发起 → 提供方回调 → 完成码 → 交换 → 会话刷新/注销。该配置项的完整 JSON 与 Studio Server/WebAssembly 的认证模式切换Authentication:Provider: ExternalAuthentication示例均见 quickstart.md从 Direct OpenID Connect 迁移的逐步指南见 外部认证迁移文档。结语一条从外部身份到Elsa 授权的完整数据链纵观整个数据模型Elsa 外部认证的核心设计原则是身份与授权严格分离IdentityProviderConnection描述信任、SecretBinding隔离机密、ExternalIdentityLink绑定身份、UnlinkedIdentityPolicy裁决准入、BrokerTransaction/AuthorizationGrant保证流程的一次性与防重放、ExternalAuthenticationSession承载有界会话与旋转刷新、ConnectionObservation/PreviewResult提供无副作用的可观测性。每一个安全语义都有对应的源码实现与 EF 持久化实体可查证感兴趣的读者可继续深入 Elsa.ExternalAuthentication 模型目录、EFCore 持久化 实体文件以及 集成测试 验证其行为。赞分享后端工作流自动化流程编排低代码【免费下载链接】elsa-coreThe Workflow Engine for .NET项目地址https://gitcode.com/gh_mirrors/el/elsa-core点击查看免费下载相关推荐Elsa 外部认证未链接身份匹配基于受信 IExternalUserMatcher 的 Unlinked Identity Policy 设计解析ADR-0022Elsa 外部认证未链接身份匹配基于受信 IExternalUserMatcher 的 Unlinked Identity Policy 设计解析ADR 0后端工作流自动化流程编排低代码Elsa 外部认证 ADR-0024 解读精确 OIDC 发现与部署派生回调的安全信任模型Elsa 外部认证 ADR 0024 解读精确 OIDC 发现与部署派生回调的安全信任模型 本篇技术指南以 Elsa 仓库中的架构决策记录 ADR 0024后端工作流自动化流程编排低代码Elsa Core 外部认证迁移指南从 Studio 直连 OpenID Connect 切换到 Elsa BrokerElsa Core 外部认证迁移指南从 Studio 直连 OpenID Connect 切换到 Elsa Broker 本文面向 Elsa 3 部署者与安全后端工作流自动化流程编排低代码上一篇StealthChanger重新定义3D打印机工具更换系统的高效轻量化解决方案下一篇重构无忧Laravel Microscope 自动化代码质量守卫全攻略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表