OpenProject 15.0.1 发布解读修复 OpenID Connect 与 Microsoft Entra 的 Tenant 传递问题【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openprojectOpenProject 15.0.1发布于 2024-11-13是一个聚焦单一关键问题的补丁版本修复了使用 Microsoft Entra原 Azure AD作为 OpenID Connect 提供方时Azure 环境的tenant租户未能正确传递给身份提供方、导致用户登录失败的问题。本文将解读该版本修复内容并结合仓库中modules/openid_connect模块的源码深入剖析 OpenProject 中 OpenID Connect 提供方的 tenant 配置、元数据发现discovery流程与 issuer 规范化逻辑帮助管理员理解问题成因、修复原理以及正确的配置方式。15.0.1 修复了什么根据 docs/release-notes/15/15-0-1/README.md 的发布说明15.0.1 包含一项重要修复This release contains an important fix for OpenID Connect providers using Microsoft Entra. The tenant of the Azure environment was not correctly communicated to the provider, resulting in failing logins.即当 OpenProject 以 Microsoft Entra 作为 OpenID Connect 身份提供方时Azure 环境的 tenant 没有被正确传递给提供方导致登录流程失败。该版本修复了此问题受影响的管理员升级到 15.0.1 后登录即可恢复正常。对应的缺陷条目为Bugfix: OpenID Connect Microsoft Entra: Tenant not correctly output社区工作包 #59261。这是一个小版本、单点修复的典型示例发布说明只有一条自动化生成区的 bugfix 记录但其影响面直接关系到所有接入 Microsoft Entra 的企业 SSO 登录。OpenProject 中的 OpenID Connect 提供方模型要理解 tenant 传递问题需要先了解 OpenProject 如何建模 OpenID Connect 提供方。相关实现位于 modules/openid_connect/app/models/openid_connect/provider.rb。OpenIDConnect::Provider继承自AuthProvider通过store_attribute :options, ...将大量配置项序列化存储在options字段中。与 Microsoft Entra 直接相关的关键配置包括配置项类型说明oidc_providerstring提供方类型取值为google、microsoft_entra、custom见OIDC_PROVIDERStenantstringAzure/Entra 租户标识如common或具体 tenant iduse_graph_apiboolean是否使用 Microsoft Graph APIazure 专属选项client_id/client_secretstringOIDC 客户端凭据issuerstring身份提供方 issuer属于必填的可发现元数据metadata_urlstringOpenID Connect Discovery 端点 URLcustom 提供方使用其中tenant与use_graph_api是 Microsoft Entra 专属配置源码注释明确标注了# azure specific option# azure specific option store_attribute :options, :use_graph_api, :boolean提供方类型通过google?、entra_id?判断其中entra_id?检查oidc_provider microsoft_entra。同时name_input_and_tenant_form.rb 显示在管理界面创建 Microsoft Entra 提供方时tenant 字段为必填项默认值为common。tenant 在 OIDC 流程中的传递链路15.0.1 修复的tenant 未正确传递问题可以从源码中还原其根因与修复机制。1. 元数据发现端点的构造在 update_service.rb 的get_metadata_url方法中OpenProject 会为内置提供方自动拼接 Discovery 端点def get_metadata_url(model) case model.oidc_provider when google https://accounts.google.com/.well-known/openid-configuration when microsoft_entra https://login.microsoftonline.com/#{model.tenant || common}/v2.0/.well-known/openid-configuration else model.metadata_url end end可见对于 Microsoft Entra元数据端点必须携带 tenant 信息https://login.microsoftonline.com/tenant/v2.0/.well-known/openid-configuration。如果 tenant 没有被正确输出到该 URL 中Discovery 请求就会落到错误的租户端点进而导致登录失败——这正是 15.0.1 之前存在的问题。2. issuer 的规范化修正在抓取 Discovery 元数据后update_service.rb 的extract_metadata方法会校验并回填元数据。其中有一段针对 Microsoft 的专门处理model.assign_attributes(result.to_h) # Microsoft responds with # https://login.microsoftonline.com/{tenantid}/v2.0 in issuer field for whatever reason... if model.oidc_provider microsoft_entra model.issuer https://login.microsoftonline.com/#{model.tenant}/v2.0 end这段注释揭示了 Microsoft 平台的一个特性其 Discovery 文档返回的issuer字段会携带真实的{tenantid}而 OpenProject 会将其规范化为基于管理员配置的tenant值的形式https://login.microsoftonline.com/#{model.tenant}/v2.0。issuer 必须与登录授权请求中的 issuer 保持一致否则令牌校验会失败——这也是 tenant 传递错误会直接导致登录失败的根本原因。3. 向 OmniAuth 策略输出 tenantProvider#to_h会将模型转换为 OmniAuth 策略所需的 Hash。hash_builder.rb 中的provider_specific_to_h按提供方类型附加专属配置def provider_specific_to_h case oidc_provider when google { client_auth_method: :not_basic, send_nonce: false } when microsoft_entra { use_graph_api:, tenant: } else {} end end对于microsoft_entratenant会被作为顶层键输出到 OmniAuth 配置中。15.0.1 的修复目标正是确保这里的tenant值与元数据端点、issuer 构造中使用的值保持正确一致从而让授权、Discovery 与令牌校验整条链路对齐。环境变量方式配置提供方含 tenant除了管理界面OpenProject 还支持通过环境变量在启动时同步seedOpenID Connect 提供方。相关配置映射逻辑位于 configuration_mapper.rb它会将环境变量 Hash 转换为 Provider 属性其中包括tenant options[tenant], use_graph_api options[use_graph_api],oidc_provider的类型推断同样在此完成——配置名name包含azure时识别为microsoft_entra包含google时识别为google否则为customdef oidc_provider(options) case options[name] when /azure/ microsoft_entra when /google/ google else custom end end种子流程由 provider_seeder.rb 读取Setting.seed_oidc_provider再经 sync_service.rb 调用CreateService/UpdateService完成创建或更新。使用环境变量配置 Microsoft Entra 提供方时务必显式提供tenant键例如common或你的目录 tenant id避免依赖默认值导致与登录请求不一致。如何确认自己是否受影响以下情况建议立即升级到 15.0.1 或更高版本使用了Microsoft EntraAzure AD作为 OpenID Connect 登录提供方升级到 15.0.x 后用户通过 Microsoft 账号登录失败且错误与 token 校验、issuer 不匹配或 Discovery 端点相关管理界面中提供方的tenant字段与 Microsoft Entra 管理门户中应用注册对应的目录租户不一致。升级后可在管理界面重新保存提供方配置触发一次元数据抓取或在环境变量配置中核对tenant值确认 Discovery URL 与 issuer 均指向正确的租户。小结OpenProject 15.0.1 是一个典型的小版本大影响补丁虽然发布说明仅包含一条 bugfix但它修复的是 Microsoft Entra 登录链路中 tenant 未正确输出的关键缺陷。通过源码可以看到tenant 贯穿元数据端点构造get_metadata_url、issuer 规范化extract_metadata与 OmniAuth 配置输出provider_specific_to_h三个环节任何一处的丢失或错配都会导致 SSO 登录失败。升级到 15.0.1 后这条链路会基于管理员配置的 tenant 保持一致登录恢复正常。如果您的团队使用 Microsoft Entra 做单点登录建议尽快升级并核对 tenant 配置如果尚未使用 OIDC 模块也可参考 modules/openid_connect 目录下的模型、服务与表单组件了解 OpenProject 对 OpenID Connect 提供方的完整建模方式。【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
