saml集成核心是sp在请求入口解析断言、校验签名并注入用户上下文,需明确idp、sp、浏览器三角色,确认实体id、acs url、sso url、idp元数据、sp证书五项配置,并强制https、验证属性映射、测试slo登出。

服务器身份认证中集成 SAML 协议,核心是让服务端(SP)安全、可靠地信任并验证来自企业身份源(IdP)的用户断言。它不是在应用层写登录页,而是在请求入口处完成协议解析、签名校验与用户上下文注入——关键在于配置可信链路,而非重复实现密码逻辑。
SAML 集成的三个必备角色
理解以下三者关系是配置前提:
- IdP(Identity Provider):如 Azure AD、ADFS、Okta 或 Keycloak,负责用户认证并签发 SAML 断言
- SP(Service Provider):你的服务器或 Web 应用,作为服务方接收并验证断言;需提供实体 ID、ACS URL、证书等元数据给 IdP
- 用户浏览器:作为中转载体,在 IdP 和 SP 之间传递编码后的 SAML 请求与响应(通常通过 HTTP 重定向或 POST)
配置前必须确认的五项基础信息
缺一不可,否则无法建立信任:
-
SP 实体 ID(Entity ID):全局唯一标识你的服务,例如
https://your-app.com/saml/metadata -
ACS URL(Assertion Consumer Service URL):IdP 回传 SAML 响应的目标地址,如
https://your-app.com/saml/acs - 单点登录 URL(SSO URL):你的应用跳转到 IdP 的起始地址,由 IdP 提供
- IdP 元数据(XML 文件或 URL):含 IdP 签名证书、支持的绑定方式、端点列表,用于自动配置或手动提取公钥
- SP 签名/加密证书(可选但推荐):用于向 IdP 发送已签名的 AuthnRequest,增强请求完整性
主流技术栈的集成要点
不同环境落地方式差异明显,重点不在“能不能”,而在“在哪做校验”:
-
Java(如使用 onelogin-java-saml):把
Auth实例注入 Servlet Filter 或 Spring Security 的SAMLAuthenticationFilter,ACS 接口需处理processResponse()并校验isAuthenticated() -
PHP(php-saml):在
processResponse()后检查$auth->getErrors(),成功时从$auth->getAttributes()提取邮箱、姓名等映射字段,写入 session -
NGINX + NJS:在
ngx.location.capture或js_content中调用verifySAMLSignature(),直接在 Web 服务器层拦截非法断言,避免请求进应用进程 - 云效、Baserow、MinDoc 等 SaaS 或开源平台:无需写代码,进入「身份源管理」或「Authentication Settings」页面,粘贴 IdP 元数据或填写 SSO URL / ACS URL / 实体 ID 即可,后台自动完成元数据解析与证书提取
上线前必须做的三件事
跳过这些,90% 的问题会出现在生产环境:
- 强制 HTTPS:所有 SAML 相关端点(ACS、SSO、元数据)必须走 HTTPS,明文传输会导致签名失效、断言被篡改
-
验证属性映射准确性:确认 IdP 返回的
mail、uid或employeeID字段真实存在且唯一,否则账号绑定失败或出现越权 -
测试登出流程(SLO):若启用单点登出,需将 SP 的 SLO endpoint(如
/saml/slo)配置到 IdP,并验证从 IdP 登出后,SP 会话是否同步失效











