跳到主要内容

· 阅读需 4 分钟

协议概述

安全断言标记语言(Security Assertion Markup Language,SAML)是一个基于 XML 的开源标准数据格式,它在当事方之间交换身份验证和授权数据,尤其是在身份提供者和服务提供者之间交换。SAML 是 OASIS 组织安全服务技术委员会(Security Services Technical Committee)的产品。

SAML 解决的最重要的需求是 Web 端应用的单点登录(SSO)。

名词说明

  • 委托人:SAML 规范定义的三个角色之一,通常为一名用户。
  • IdP:Identity Provider,身份提供者,SAML 规范定义的三个角色之一,通常指身份鉴别服务器。
  • SP:Service Providers,服务提供者,SAML 规范定义的三个角色之一。
  • Assert:断言,是指 IdP 认证用户后,发送认证结果给 SP 的一种形式,以表示委托人的基本信息、权限信息等。

应用场景

SAML 解决的最重要的需求是网页浏览器单点登录。在 SAML 协议中,一旦用户身份被 IdP 认证过后,该用户再去访问其他在主站注册过的应用(SP)时,都可以直接登录,而不用再输入身份和口令。

运行流程

  1. 用户请求访问 Web 应用系统。
  2. Web 应用系统生成一个 SAML 身份验证请求。
  3. Web 应用系统将重定向网址发送到用户的浏览器。重定向网址包含应向 SSO 服务提交的编码 SAML 身份验证请求。
  4. IDP 对 SAML 请求进行解码。
  5. IDP 对用户进行身份验证。认证成功后,IDP 生成一个 SAML 响应,其中包含经过验证的用户的用户名。然后将 SAML 响应编码并返回到用户的浏览器。
  6. 浏览器将 SAML 响应转发到 Web 应用系统 ACS URL。
  7. Web 应用系统使用 IDP 的公钥验证 SAML 响应。如果成功验证该响应,ACS 则会将用户重定向到目标网址。
  8. 用户将重定向到目标网址并登录到 Web 应用系统。
信息

在 SAML 协议中,IDP 和 SP 不需要直接进行通讯,只要用户浏览器可以访问到 IDP 和 SP 即可。也就是说 SAML 协议在混合云环境下也可以正常进行使用,只要用户浏览器可以访问到公有云的 IDP 和内网的应用就可以使用 SAML 协议集成应用的单点登录。

· 阅读需 3 分钟

起因

谷歌 Chrome80 在 2020 年 2 月 4 号发布的版本(schedule)会逐渐屏蔽第三方 Cookie,即默认为所有 Cookie 加上 SameSite=Lax 属性(Cookies default to SameSite=Lax),并且拒绝为不安全的 Cookie 设置 SameSite=None 属性(Reject inSecure SameSite=None cookies),这样是为了从源头屏蔽跨站请求伪造 CSRF(Cross Site Request Forgery)漏洞。

造成的问题

单点登录时,业务系统 POST 方式请求 TOPIAM ,在 TOPIAM 已经登录的会话会丢失,需要重新认证。

解决方式

要解决这样的问题,我们要先了解根源 SameSite 属性有三:

Strict: Strict 最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。

Set-Cookie: CookieName=CookieValue; SameSite=Strict;

这个规则过于严格,可能造成非常不好的用户体验。比如,当前网页有一个 GitHub 链接,用户点击跳转就不会带有 GitHub 的 Cookie,跳转过去总是未登陆状态。

Lax: 任何跨域请求都不会携带 Cookie,不包括 location.href Lax 规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。

Set-Cookie: CookieName=CookieValue; SameSite=Lax;
请求类型示例正常情况Lax
链接<a href="..."></a>发送 Cookie。发送 Cookie。
预加载<link rel="prerender" href="..."/>发送 Cookie。发送 Cookie。
GET 表单<form method="GET" action="...">发送 Cookie。发送 Cookie。
POST 表单<form method="POST" action="...">发送 Cookie。不发送 Cookie。
iframe<iframe src="..."></iframe>发送 Cookie。不发送 Cookie。
AJAX$.get("...")发送 Cookie。不发送 Cookie。
Image<img src="...">发送 Cookie。不发送 Cookie。
  • None: 没有限制。

必须同时设置 Secure 属性(Cookie 只能通过 HTTPS 协议发送),否则无效。 【该操作适用于 2019 年 2 月 4 号谷歌发布 Chrome 80 稳定版之后的版本】

下面的设置无效:

Set-Cookie: TOPIAM-employee-portal-cookie=ZWEzMDg1MjgtMWUyZS00MGE2LWI0MjQtNmYwNmQxZGYyOGEy; SameSite=None

下面的设置有效:

Set-Cookie: TOPIAM-employee-portal-cookie=ZWEzMDg1MjgtMWUyZS00MGE2LWI0MjQtNmYwNmQxZGYyOGEy; SameSite=None; Secure