SAML 身份验证的直观说明


SAML(安全断言标记语言)是企业中最常用的身份验证协议和 SSO 解决方案。

 什么是 SSO?


简而言之,它相当于我们在互联网应用程序中看到的“Login with Google”或“Login with Facebook”按钮。


我们最初在 Google 或 Facebook 等中注册一个帐户,然后使用该帐户登录其他应用程序,如 Spotify、Netflix、Zoom 等。我们这样做是为了避免维护多个用户名/密码。


同样,企业维护一个单一的用户管理系统,员工使用他们的公司帐户登录第三方服务,如 Salesforce、Workday、Expensify 等,而无需创建单独的帐户或记住多个密码。


这称为 SSO(单点登录),SAML 是事实上的企业 SSO 解决方案。

 参与者


SAML 身份验证流程涉及 3 个主要参与者:

 身份提供商 (IdP)


这就是我们之前谈到的集中式用户管理系统。此服务器负责对用户进行身份验证,并将用户详细信息(如电子邮件地址、姓名、部门等)传递给服务提供商。


常见的身份提供商包括 Azure AD、Auth0、Onelogin、Okta、G Suite 等。

 服务提供商 (SP)


这是信任 IdP 并希望将其用于身份验证的应用程序。示例:Salesforce、Workday、Expensify、$YOUR_AWESOME_APP 等

 主要


这是尝试通过 IdP 登录 SP 的用户。

 身份验证流


用户有两种常见的 SP 访问方式:

 IdP 发起登录:


用户首先转到 IdP,然后显示他们有权访问的 SP 列表。从该列表中选择 SP 后,他们将被重定向到该 SP。

 SP 发起登录


在此流程中,用户首先转到 SP 的网站。如果用户没有与 SP 的活动会话,则用户将被重定向到 IdP 进行身份验证。成功登录后,用户将被重定向回 SP。我们将详细讨论此流程。

 SP 启动的 Flow:


让我们从用户的角度来谈谈流程。


  • 用户转到 SP 的网站。如果用户未登录,则会显示“使用 SSO 登录”按钮

  • 单击登录按钮后,用户将被重定向到 IdP 的网站,并要求他们提交凭据

  • 成功登录后,用户将被重定向回 SP 的网站,他们可以在其中执行其工作


现在,让我们放大一下,了解幕后发生的事情:


  • SP 检查活动会话

  • SP 向 IdP 发送 AuthnRequest

  • IdP 对用户进行身份验证

  • IdP 向 SP 发送 SAML 断言

  • SP 创建会话并登录用户


SP 检查活动会话


SAML 不维护会话,因此 SP 需要为每个经过身份验证的用户维护会话。当用户访问 SP 网站时,它会检查用户是否与该网站有活动会话。


如果存在活动会话,则用户可以进入网站,否则会显示“使用 SSO 登录”按钮。


SP 向 IdP 发送 AuthRequest


当用户单击“使用 SSO 登录”按钮时,SP 会生成一条名为“AuthnRequest”的 XML 消息,其中包含有关发送请求的人员(颁发者)、用户通过身份验证后重定向到何处(断言消费者服务 url)和安全措施(ID、IssueInstant)的详细信息。


下面是一个示例 AuthnRequest XML


此 XML 被编码为 url 安全字符串,作为查询参数嵌入到对 IdP 的请求中,用户被重定向到此 IdP url:

https://idp.com/SAML2/SSO/Redirect?SAMLRequest=EncodedAuthnRequest


IdP 对用户进行身份验证


IdP 维护自己的关于用户的会话,如果用户存在活动会话,则会将用户重定向到 SP。如果会话不存在,系统会要求用户输入其凭证。


IdP 可以选择如何对用户进行身份验证 - 可以是用户名/密码、TOTP、MFA 等。


IdP 向 SP 发送 SAML 断言


用户成功通过身份验证后,IdP 会将一个名为“SAML Assertion”的 XML 消息发回 SP 的断言使用者服务 URL。这包含用户的详细信息,例如姓名、电子邮件、部门等和安全措施(InResponseTo、IssueInstant)。


它还经过数字签名,因此 SP 可以相信消息确实来自 IdP,并将用户登录到他们的系统。


SP 创建会话并登录用户


用户现在已成功登录到 SP 的网站!SP 将为用户创建一个会话,以便用户可以在下次访问网站时自动登录。

 结论


希望这篇文章能够为您提供 SAML 身份验证以及 SSO 工作原理的高级概述。

 感谢阅读!:)

 相关文章:

使用 Microsoft Entra ID 在 Node.js 中实施 SAML SSO