SAML 身份验证(Security Assertion Markup Language,安全断言标记语言)是一种用于在不同安全域之间传递用户身份验证信息的开放标准。它允许用户使用一套凭据登录一次,即可访问多个不同的应用程序或服务,实现了单点登录(SSO)。
什么是SAML
为了更直观地理解 SAML 身份验证,我们可以用一个生活中的例子来比喻:
比喻:
想象一下,你有一张“万能通行证”(SAML 断言),可以让你进入不同的俱乐部(服务提供商)。你首先需要在一个“认证中心”(身份提供商)进行身份验证,例如出示身份证和会员卡。认证中心验证你的身份后,会在你的“万能通行证”上盖章(生成 SAML 断言)。然后,你拿着盖章的“万能通行证”就可以直接进入各个俱乐部,无需再次验证身份。
SAML 身份验证的三个主要参与者:
- 主体(Principal): 用户,想要访问某个应用程序或服务的人。
- 身份提供商(IdP,Identity Provider): 负责验证用户身份的实体,例如公司内部的身份验证系统或第三方身份验证服务。
- 服务提供商(SP,Service Provider): 用户想要访问的应用程序或服务。
SAML 身份验证的工作流程(结合比喻):
- 用户尝试访问服务提供商(SP): 用户尝试进入某个俱乐部(SP)。
- SP 将用户重定向到身份提供商(IdP): 俱乐部门口的保安发现你没有通行证,告诉你需要先去认证中心(IdP)进行认证。
- 用户在 IdP 进行身份验证: 用户在认证中心(IdP)出示身份证和会员卡进行身份验证。
- IdP 生成 SAML 断言并发送给用户: 认证中心(IdP)验证用户身份后,在用户的“万能通行证”(SAML 断言)上盖章,并把通行证交给用户。这个“通行证”实际上是一个包含用户身份信息的 XML 文档。
- 用户将 SAML 断言发送给 SP: 用户拿着盖章的“万能通行证”(SAML 断言)回到俱乐部(SP)。
- SP 验证 SAML 断言并授予用户访问权限: 俱乐部门口的保安检查“万能通行证”上的印章(验证 SAML 断言的签名和有效性),确认无误后允许用户进入。
用图示来更清晰地说明:
+-------+ 1. 请求访问受保护资源 +-------+ 4. 传递 SAML 断言 +-------+
| 用户 | ----------------------------> | SP | ----------------------------> | 用户 |
+-------+ +-------+ 5. 用户将断言发送给 SP +-------+
^ |
| 2. 重定向到 IdP |
| V
+-------+ 3. 身份验证 & 生成断言 +-------+
| IdP | <---------------------------- | SP |
+-------+ +-------+
SAML 断言包含的信息:
- 身份验证断言: 验证用户的身份,包括用户登录的时间和使用的身份验证方法(例如密码、MFA 等)。
- 属性断言: 包含关于用户的特定属性,例如姓名、电子邮件地址、角色等。
- 授权决策断言: 说明用户是否获得使用服务的授权,或者身份提供方是否拒绝了请求。
SAML 的优势:
- 单点登录(SSO): 用户只需登录一次即可访问多个应用程序,提高了用户体验。
- 增强安全性: 无需在 SP 端存储用户凭据,降低了凭据泄露的风险。
- 简化身份管理: 集中管理用户身份,简化了用户管理和维护。
- 跨域身份验证: 允许不同组织或安全域之间的用户进行身份验证。
SAML(安全断言标记语言)是企业中最常用的身份验证协议和单点登录(SSO)解决方案。
什么是SSO?
简而言之,它是企业版的“使用Google登录”或“使用Facebook登录”按钮,这些按钮我们在互联网应用中经常看到。我们最初在Google、Facebook等平台注册账号,并使用该账号登录到Spotify、Netflix、Zoom等其他应用。这样做的目的是避免管理多个用户名/密码。同样,企业维护一个单一的用户管理系统,员工可以使用他们的企业账号登录到Salesforce、Workday、Expensify等第三方服务,而无需创建单独的账户或记住多个密码。这就叫做SSO(单点登录),而SAML是事实上的企业SSO解决方案。
参与者
SAML身份验证流程涉及三个主要参与者:
-
身份提供者(IdP)
这是我们之前提到的集中式用户管理系统。这个服务器负责验证用户身份,并将用户的详细信息(如电子邮件地址、姓名、部门等)传递给服务提供者。常见的身份提供者包括Azure AD、Auth0、Onelogin、Okta、G Suite等。 -
服务提供者(SP)
这是信任IdP并希望使用其进行身份验证的应用程序。例如:Salesforce、Workday、Expensify、$YOUR_AWESOME_APP等。 -
主体(Principal)
这是试图通过IdP登录SP的用户。
身份验证流程
用户访问SP有两种常见方式:
-
IdP发起的登录:
用户首先访问IdP,并看到他们有权限访问的SP列表。选择一个SP后,用户将被重定向到该SP。 -
SP发起的登录:
在这种流程中,用户首先访问SP的网站。如果用户没有与SP的活动会话,用户将被重定向到IdP进行身份验证。登录成功后,用户将被重定向回SP。我们将详细讨论这种流程。
SP 发起的登录流程
让我们从用户的角度来讨论这个流程。
- 用户访问 SP 的网站。如果用户未登录,网站会显示一个“使用SSO登录”按钮。
- 用户点击登录按钮后,会被重定向到 IdP 的网站,在那里他们会被要求提交凭证。
- 登录成功后,用户将被重定向回 SP 的网站,开始执行工作。
现在,让我们更深入地了解幕后发生了什么:
SP 检查活动会话
SP 会检查用户是否已有有效的会话。如果有活动会话,用户可以直接进入网站,否则会显示“使用SSO登录”按钮。
SP 发送 AuthnRequest 到 IdP
用户点击“使用SSO登录”按钮后,SP 会生成一个名为“AuthnRequest”的 XML 消息,包含关于请求发送者(Issuer)、用户认证后重定向的地址(Assertion Consumer Service URL)和安全措施(ID,IssueInstant)等信息。以下是一个示例的 AuthnRequest XML。
该 XML 被编码为 URL 安全的字符串,并作为查询参数嵌入到请求中,用户将被重定向到这个 IdP URL:
https://idp.com/SAML2/SSO/Redirect?SAMLRequest=EncodedAuthnRequest
IdP 认证用户
IdP 会维护其自己的用户会话,如果用户已有有效的会话,用户将被直接重定向回 SP。如果没有有效会话,用户将被要求输入凭证。IdP 可以选择认证用户的方式——可以是用户名/密码、TOTP(一次性密码)、MFA(多因素认证)等。
IdP 向 SP 发送 SAML 断言
一旦用户成功认证,IdP 会向 SP 的 Assertion Consumer Service URL 发送一个名为“SAML 断言”的 XML 消息。该消息包含用户的详细信息,如姓名、电子邮件、部门等,以及安全措施(InResponseTo,IssueInstant)。消息还会进行数字签名,以便 SP 信任该消息确实来自 IdP,并将用户登录到系统中。
SP 创建会话并登录用户
用户现在已成功登录到 SP 的网站!SP 会为用户创建一个会话,确保下次用户访问时可以自动登录。