单点登录

通过企业级 SAML SSO,把你公司邮箱域名的登录交给自己的身份提供商。

单点登录把 Carbon 的身份认证委托给 SAML 2.0 的身份提供商,例如 Okta、Entra ID 或 Google Workspace。你通过 DNS 验证某个邮箱域名后,Carbon 会自动把该域名上的 ERP 和 MES 用户引导到身份提供商。魔法链接和其他登录方式仍然可用,直到你启用强制 SSO。

前置条件

SSO 是你自有自托管部署的 Enterprise Edition(EE)功能(CARBON_EDITION=enterprise,需要商业许可)。Carbon Cloud 的登录不受影响。通过环境变量启用:

AUTH_PROVIDERSenum[]optional
在逗号分隔的登录方式列表中加入 sso。
SAML_ENABLEDbooleanoptional
开启认证服务中的 SAML 引擎。
SAML_PRIVATE_KEYstringoptional
SAML 签名密钥:base64 编码的 PKCS#1 DER RSA 密钥,至少 2048 位。生成命令见 .env.example。

连接身份提供商

所有操作都在一个界面:设置 → 安全下的 "Single Sign-On"(查看需要 settings 查看权限;保存需要 settings 更新权限)。

整个 SSO 交互都在一个设置界面完成。

复制 Carbon 的服务提供商详情。 "Service Provider Details" 卡片显示 "ACS URL" 和 "SP Metadata URL",均带复制按钮。

在 IdP 中把 Carbon 注册为 SAML 应用,使用这两个 URL。断言必须包含邮箱属性;Carbon 用邮箱把每次登录匹配到个人和公司。

把 IdP 元数据粘贴回 Carbon。 在 "Identity Provider" 卡片中提供 "IdP Metadata URL" 或原始 "IdP Metadata XML"(二选一),然后点击 "Save"。卡片出现 "Require SSO" 开关和 "Deactivate" 按钮即表示连接已激活。

验证邮箱域名。 连接建立后会出现 "Email Domains" 卡片。添加员工登录使用的每个域名,发布它显示的 DNS 记录,然后点击 "Verify"。只有已验证的域名才会走 SSO 登录。

验证域名

每个添加的域名初始为 Pending(待验证),卡片上显示唯一的 TXT 质询:

记录值
主机_carbon-challenge.example.com
类型TXT
值carbon-domain-verification=<你的唯一令牌>

在你的 DNS 服务商发布该记录,点击 "Verify",匹配后域名变为 Verified(已验证)。验证是一次性的,之后可以删除 TXT 记录。待验证的域名在任何地方都不生效,因此添加它总是安全的。

HEADS UP

已验证的声明是排他的

一个域名只能由一家公司持有已验证状态,先证明 DNS 控制权者获胜,且即使 DNS 控制权之后易手,该声明仍然有效。干净的交接方式是持有公司 Remove(移除) 该域名,让新所有者可以验证。

登录如何工作

在优先输入邮箱的登录页,选择 "Continue" 会把用户重定向到该域名启用的 IdP,或继续标准魔法链接流程。创建会话前,Carbon 要求断言的邮箱域名匹配连接上某个已验证的域名。

SSO 初始化是邀请优先的,不支持自助注册。现有成员的首次 SSO 登录会把 SAML 身份链接到其账户。待处理的邀请会在首次 SSO 登录中被接受,并应用其分配的角色。Carbon 会拒绝其他所有用户,不为其创建账户。请先在员工目录中创建邀请,然后重试。

强制 SSO

"Require SSO" 开关使 IdP 成为已验证域名唯一允许的认证方式。Carbon 在服务端拒绝魔法链接、Google、Outlook 和通行密钥。该开关只在连接激活后出现,便于你在强制前先验证登录。关闭它会恢复其他方式。"Deactivate" 会删除连接、释放域名声明,并恢复其他方式。

HEADS UP

紧急恢复

如果已强制启用且 IdP 不可达,被覆盖域名上的所有人都无法登录来关闭它。运维人员可以直接在数据库中解除,魔法链接登录会在下次尝试时恢复:

sql
UPDATE "ssoConnection" SET "requireSso" = false WHERE "companyId" = '<id>';

SSO 会话会绕过 Carbon 的双因素验证,包括在受控部署中,因为 IdP 会执行自己的 MFA 策略。魔法链接登录仍使用 Carbon 的双因素验证。

相关内容