SAML

让使用 SAML 2.0 的应用以 Prism 作为身份提供方完成登录。

SAML#

Prism 既是 SAML 2.0 身份提供方,也是 OAuth / OIDC 提供方。许多 SaaS 工具只支持 SAML,这类应用也可以借助 Prism 完成登录。

设置应用#

  1. 在 我的应用 → 新建应用 中创建应用,或打开已有应用。

  2. 在应用的 SAML 标签页中,选择 设置 SAML,然后填写服务提供方一侧的信息:

    • 服务提供方实体 ID:即应用所称的 Entity ID、Audience URI 或 SP Issuer。

    • 断言消费服务(ACS)URL:Prism 向此处 POST 响应,每行一个。必须使用 https;http 仅适用于 localhost。

    • NameID:应用用来标识用户的方式。可选择此应用专用 ID,或邮箱地址 (仅对已验证邮箱的账户有效)。参见用户 ID。

    • 签名:Prism 签名的内容。大多数应用希望签名断言。错误响应始终签名。

    • 单点登出 URL(可选):应用的 SingleLogoutService URL,以及应用元数据中为其 列出的绑定。参见单点登出。

    • 签名证书(可选,需配合单点登出):应用签名登出消息所用的证书,见其元数据, PEM 或 base64 格式。必须是 RSA 密钥,或 P-256、P-384、P-521 曲线上的 EC 密钥。

  3. 在同一标签页中,把 Prism 的信息提供给应用。通常只需元数据 URL:

设置
值
元数据 URL / IdP 实体 IDhttps://your-prism-domain/saml/metadata
单点登录 URLhttps://your-prism-domain/saml/sso
单点登出 URLhttps://your-prism-domain/saml/slo
签名证书从 SAML 标签页下载

单点登录 URL 和单点登出 URL 均同时支持 HTTP-Redirect 和 HTTP-POST 绑定。

用户 ID#

持久 NameID 和 uid 属性携带的是用户在该应用的 SAML 身份 ID,而不是其 Prism 用户 ID:

  • 默认情况下,用户首次登录某个应用时会为其生成新的随机 ID,应用之间无法借此关联 同一用户。

  • 用户可以在 SAML 身份 中创建共享身份。首次登录某个应用时可改为选择共享身份, 为其选择该身份的应用都会获得相同的 ID。无需授权同意的应用也会询问一次。

  • 无论哪种方式,应用都会保留该 ID:它永不变化,撤销应用授权也不例外。

属性#

属性
发送条件
uid始终发送。用户在此应用的 ID,与 NameID 相同
username、name应用允许 profile
email应用允许 email 且邮箱已验证
teams应用允许 teams:read。团队 ID
groups应用允许 teams:read。身份组,格式为 team-id:group-slug

属性名称使用 basic 名称格式。在应用的 权限 标签页中选择应用的 scope。SAML 登录会忽略应用的其他 scope,包括其他应用的权限:这些需要访问令牌,请改用 OAuth 登录。

登录流程#

  • 登录由应用发起(SP-initiated)。Prism 不发送未经请求的响应(IdP-initiated 登录)。

  • 响应只通过 HTTP-POST 绑定发送到为该应用注册的 ACS URL。Prism 不校验请求上的 签名。

  • 授权同意的流程与 OAuth 相同。用户首次使用时批准应用,之后 始终授权 即可跳过 该询问。在应用的 OAuth 登录中选择的 始终授权 同样适用于 SAML,只要其中 包含 SAML 发送的范围。第一方应用从不询问授权同意。应用的 访问白名单 依然生效,应用会出现在用户的已授权应用中。

  • ForceAuthn 会要求用户重新登录。若用户需要先登录、批准应用或为其选择身份, IsPassive 会得到一个 NoPassive 响应。

  • 如果请求的 NameID 格式与配置的不同,将收到 InvalidNameIDPolicy 响应。

该证书为自签名证书,有效期至 2049 年。它封装了同时用于签名 Prism ID token 的 密钥。

单点登出#

设置了单点登出 URL 的应用会一同登出:

  • 从这样的应用登出时,用户会从 Prism 登出,然后从同一浏览器会话中通过 SAML 登录过、 且设置了单点登出的其他应用登出。最后该应用收到 LogoutResponse。

  • 未设置应用的签名证书时,Prism 无法判断登出请求由谁发出,因此任何网站都可能发送。 在登出请求结束 Prism 会话之前,Prism 会先询问用户。若用户选择保持登录,应用会收到 RequestDenied 响应。

  • 设置了应用的签名证书后,其登出请求必须用该证书签名(RSA 或 ECDSA,SHA-256 或更强), Destination 须为 Prism 的单点登出 URL,且签发不超过 5 分钟。每个请求只能使用一次。Prism 会拒绝其他请求; 通过校验的请求会直接让用户登出,无需询问。应用的登出响应也必须签名,否则 Prism 视该登出为未确认(PartialLogout)。

  • 从 Prism 登出(通过账户菜单或 OIDC end_session)时,会先从这些应用登出,再继续。

  • 浏览器依次访问每个应用。若有应用未应答,发起登出的应用会得知登出不完整 (PartialLogout)。

  • 若登出请求针对的并非当前登录 Prism 的用户,则不会登出任何人,并收到 UnknownPrincipal 响应。

  • Prism 会签名其登出消息:HTTP-POST 绑定签名 XML,HTTP-Redirect 绑定签名查询字符串。

  • 不经过浏览器结束的会话(过期,或从其他设备登出)不会通知到应用。

关闭 SAML#

站点管理员可以决定哪些应用可以使用 SAML:

  • 管理 → 设置 → 用户与团队 → SAML 设置站点默认值。

  • 在用户或团队的管理页面中,可以为其拥有的应用覆盖该默认值。

  • 在应用的 管理 标签页中,可以为该应用覆盖以上两者。

每项覆盖都可以选择跟随上一级、允许 SAML 或停用 SAML。应用的 SAML 被停用时,从该应用 发起的登录和单点登出会失败,Prism 也不再向其发送登出请求,所有者无法修改其 SAML 设置, 但设置会保留,待重新允许后继续使用。