外部身份验证如何工作?

信息安全 应用安全 Web应用程序 验证 联邦
2021-08-24 04:07:21

例如,我可以通过登录OpenID、Yahoo等外部网站来登录stackexchange网站,这是如何工作的?网站(例如 SE 和 Yahoo!)如何通信?雅虎怎么样!知道它真的是 stackexchange 吗?stackexchange 如何知道我已成功登录 Yahoo! 它真的是雅虎!?stackexchange 是否知道我是否注销了 Yahoo! 我在这里登录后?

2个回答

在您的特定示例中,StackExchange 使用 OpenID。OpenID 支持身份提供者的概念——Yahoo 是一个身份提供者,与 Google、MyOpenID 等一样。登录 StackExchange 会询问您要使用哪个提供者,然后将您重定向到该提供者的登录页面。

一旦您对提供者进行身份验证,提供者就会使用令牌将您重定向回 StackExchange。此令牌包含您的身份信息。这通常称为基于声明的身份验证,其中声明是关于身份的一条信息,例如您的姓名,并且声明被捆绑到令牌中。

通信是通过 HTTP 302 重定向和 HTTP POST 完成的,所有这些都通过用户的浏览器完成。Yahoo 知道它的 StackExchange,因为 Yahoo URL 包含一个参数,表明它是 StackExchange。StackExchange 知道身份令牌来自 Yahoo,因为它是由 Yahoo 签名的。

见这里: http: //openid.net/get-an-openid/what-is-openid/

在这里: http: //openidexplained.com/

关于身份令牌- 它可以采用多种形式。在一个特殊情况下(我知道 OpenID 支持),令牌实际上是一组 URL 参数。它们提供了许多东西,包括:

  1. 唯一标识您的身份(例如您的 OpenID/URL)
  2. 一个签名。这是一个加密哈希,由上面的身份信息和只有您的 OpenID 提供者和 StackExchange 知道的预先建立的秘密创建。

如果您更改识别信息,就会破坏签名,StackExchange 将拒绝您登录。您也无法从头开始成功地重新创建签名,因为您不知道共享密钥。

我更熟悉的另一种令牌形式是长伪随机字符串。您的浏览器从身份提供者返回,并在 URL 中包含此内容。然后客户端站点(例如 StackExchange)直接根据身份提供者检查令牌;提供商查看其最近发行的令牌列表,如果找到,则将您的唯一标识信息返回给客户。

关于注销/单点注销- 不,StackExchange 不知道您是否注销了 OpenID 服务。同样,如果您退出 StackExchange,您的 OpenID 提供商也不会收到通知。

一些系统(谷歌邮件/文档/日历是一个很好的例子)使用一种方法,将您从您正在使用的站点/服务您的 ID 提供程序服务中注销。但是,所有其他服务均不受影响。例如:

  1. 登录 Gmail
  2. 链接到 Google 文档(您无需再次登录)
  3. 退出 Gmail(您的 Google 文档会话将不受影响)
  4. 您访问的下一个 Google 服务会要求您再次登录

参考: