ChromeOS 中的 SAML 身份验证

默认情况下,Google 的外部可访问账号服务会处理 Google 账号的身份验证。当未经身份验证的用户访问需要身份验证的 Google 网页时,Google 登录表单会要求用户提供电子邮件地址和密码。用户提交电子邮件地址和密码后,Google 身份验证会验证所输入的凭据是否正确。如果凭据正确,Google 身份验证会设置用户的登录 Cookie。

有些企业会使用更复杂的模型,让第三方身份提供商 (IdP) 处理身份验证。Google 身份验证通过行业标准的安全断言标记语言 (SAML) 协议支持此模型。管理员可以配置网域以使用 SAML 身份验证。

获取用户密码

ChromeOS 需要识别用户在登录期间输入的密码,以便:

  • 加密存储在磁盘驱动器上的用户数据。
  • 保护锁屏。
  • 在无法访问网络时启用离线登录。

使用 SAML 时,密码不会直接在 ChromeOS 系统对话框中输入,而是在身份提供商托管的 WebView 中输入。虽然 ChromeOS 可以访问 HTML,但由于不清楚哪些表单字段包含数据,因此无法以简单规范的方式获取密码。

使用 SAML 时,可通过两种方式获取用户密码:凭据传递 API 和密码抓取。

Chrome 凭据传递 API

Google 提供了一个 Credentials Passing API,身份提供方可以在 SAML 页面上以 JavaScript 形式实现该 API,以将所需的数据传递给 ChromeOS。Google 身份验证使用此 API,但任何 SAML 身份提供方也可以使用此 API。

密码抓取

如果 SAML 身份提供商不支持 Credentials Passing API,则可能会使用密码抓取。

在此方法中:

  1. 身份验证屏幕会将内容脚本注入到托管登录流程的 WebView 中。
  2. 内容脚本会识别密码类型的 HTML 输入字段,并将其内容复制到一个数组中。每当密码字段的内容发生更改时,系统都会更新该数组。
  3. 抓取的密码会发送到后台网页,并在其中累积。这样,即使登录流程涉及多次重定向到不同的 HTML 网页,密码也能被捕获。

在登录流程结束时,系统会从后台网页中检索抓取的密码数组。可能出现以下三种情况:未抓取到密码、抓取到 1 个密码或抓取到多个密码。

未抓取任何密码

内容脚本无法在身份提供方提供的 HTML 页面中找到密码。身份提供方可能不使用传统密码。

在这种情况下,ChromeOS 会提示用户为设备选择手动密码。如果密码不存在(例如通过智能卡、NFC、生物识别进行身份验证),ChromeOS 身份验证流程可能会在没有密码的情况下继续进行

系统仅抓取了一个密码

内容脚本仅识别一个密码。很可能,这是用于身份验证的用户密码。

在这种情况下,我们很可能正确抓取了用户的密码。ChromeOS 将使用抓取的密码作为用户的密码,以继续执行身份验证流程

系统检测到不止一个密码被抓取

内容脚本识别出多个密码。这种情况可能会在以下情况下发生:身份提供方要求用户在登录表单中输入永久密码和一次性密码。

在这种情况下,我们可能抓取了用户的实际密码以及一些 ChromeOS 不感兴趣的其他密码字段。为了确定哪个密码是正确的,ChromeOS 会提示用户在额外的密码提示中再次输入密码。

如果输入的密码与某个抓取的密码一致,则表示用户的实际密码已被识别,身份验证流程将继续。如果找不到匹配项,系统会提示用户再次输入密码。两次不匹配后,登录失败并显示错误消息。

企业注册

对于企业注册,需要注册用户的电子邮件地址,以便将设备与正确的网域相关联。在设备政策提取期间,电子邮件会从设备管理 (DM) 服务器发送到 Chrome 的 PolicyData 消息的用户名字段中。无需确定用户密码。