假设我有两个位于不同域中的网站,它们的服务提供商都与第三个域上的同一个身份提供商进行通信。我登录第一个网站并进行身份验证,现在我决定访问第二个网站。第二个网站与身份提供者通信,因此我无需再次登录即可访问我的帐户。这是如何使用 SAML 实现的?在这种情况下可以使用 cookie 吗?
SAML 如何解决跨域单点登录问题?
它实际上可以是一个 cookie,因为它根本不需要与服务提供者相关联,只需与身份提供者相关联。这两个服务提供者中的任何一个都要做的是向身份提供者发出身份验证请求,因此 sp.example1.com 的未经身份验证用户的过程与 sp.example2.com 的过程相同。
但是,当第一个请求来自 sp.example1.com 并且用户被重定向到 sso.example3.com 时,用户将登录到 sso.example3.com,然后可以为 sso.example3.com 设置 cookie。
然后,当用户访问 sp.example2.com 时,它也会将未经身份验证的用户重定向到 sso.example3.com,但这一次,浏览器将有一个 cookie 与用户上次访问 sso 的请求一起发送.example3.com,即使该访问是由不同的服务提供商发起的。
因此,来自 sso.example3.com 的 cookie 可以将用户识别为已通过身份验证,并且身份提供者可以继续为用户发出断言到 sp.example2.com 的过程,而无需用户再次完成登录工作流程。
可以使用 cookie。
Cookie 只不过是您与之通信的 Web 应用程序存储在您的浏览器中的一小段数据(名称-值对)。每个 cookie 都有一个与之关联的域,并且属于 example.com 的 cookie 不能被 abc.com 访问。重要的是要注意,每当浏览器向某个域发出 HTTP 请求时,与该域关联的所有 cookie 也会与请求一起发送到服务器。
在 SAML 术语中
身份提供者 (IdP) - 将身份验证作为服务提供
服务提供商 (SP) - 依靠 IdP 对其用户进行身份验证
使用 SAML 的 SSO:假设用户希望访问两个服务 SP1 和 SP2。
用户访问 SP1 并尝试登录。SP1 向 IdP 发送身份验证请求,用户的浏览器被重定向到 IdP,他在其中输入凭据。成功验证后,用户再次被重定向到 SP1,并且 IdP 向 SP1 发送包含验证信息的断言。现在用户已通过身份验证,可以使用 SP1 的服务。在这种情况下,来自 IdP 的响应还包含一个用于识别用户的 cookie。该 cookie 存储在浏览器中。
现在用户在浏览器中打开另一个选项卡并尝试访问 SP2 的网站。再次,当他尝试登录时,浏览器被重定向到 IdP,并且通过此重定向,IdP 设置的 cookie 也被发送。IdP 接收 cookie 并发送一个断言,将浏览器重定向回 SP2。用户无需再次输入其凭据即可登录到 SP2。
我相信mod_auth_openidc通过使用 iframe 将此功能实现为“会话管理”。这里
但我不知道其他 SAML/OpenIdC 产品是否有其他更好/替代解决方案
挑战是会话 cookie,因为我们知道我们会在 SSO 网站中设置会话 cookie 或基于时间的 cookie,但是由于通常用户正在访问 SP1 和 SP2 站点,因此会话 cookie 和时间 cookie 在访问期间都会过期。我们如何保持登录状态?尝试在后端对 SSO 网站进行 ajax 调用?这是我能想到的一种方式。