SAML
让使用 SAML 2.0 的应用以 Prism 作为身份提供方完成登录。
SAML#
Prism 既是 SAML 2.0 身份提供方,也是 OAuth / OIDC 提供方。许多 SaaS 工具只支持 SAML,这类应用也可以借助 Prism 完成登录。
设置应用#
在 我的应用 → 新建应用 中创建应用,或打开已有应用。
在应用的 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 密钥。
在同一标签页中,把 Prism 的信息提供给应用。通常只需元数据 URL:
| 元数据 URL / IdP 实体 ID | https://your-prism-domain/saml/metadata |
| 单点登录 URL | https://your-prism-domain/saml/sso |
| 单点登出 URL | https://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 且邮箱已验证 | |
| 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 设置, 但设置会保留,待重新允许后继续使用。