OpenID的创造性使用

时间:2011-05-10 20:06:03

标签: openid

情况

我有三个网站都曾经是同一个网站。因此,他们使用单个数据库进行用户管理和身份验证。不幸的是,它们是非常不同的网站,并且已经发展到包含截然不同的功能。

当所有三个网站只是一个网站时,我们使用了一个漂亮的布局切换器,它根据请求的URL来确定要使用的样式表。但是,如果您使用domain1.com中的用户登录domain2.com,则服务器只会为您交换URL而不会出现问题。

当我们在一个站点添加功能时,我们需要将三个功能分成不同的系统,以防止我们自己踩到。向domain1添加功能会破坏domain3上不相关的系统,因此保持分离更加智能。但是我们保留了相同的用户数据库,因为它与我们的许可和订阅系统相关联。

现在,我们希望开始使用SSL / TLS来保护网站...这意味着它们是通过HTTPS而不是HTTP传输的。

使用HTTP,我们没有太多问题将用户从一个站点版本反弹到另一个站点版本。您可以登录到三个站点中的任何一个站点,服务器将检测您所谓的所在的站点,然后将您带到那里。由于我们使用状态服务器进行会话管理,因此您在传输中也没有丢失任何内容(相同的用户数据库,相同的会话ID,相同的会话)。

使用HTTPS,当我们将用户从一个站点踢到另一个站点时,我们就会失去这一点。目前,我们可以做的最好的事情是显示弹出窗口并解释“您打算登录domain2.com ...请更新您的书签并重新登录”,然后再将其踢到正确的域名。这是有效的,但它是一个不优雅的解决方案,让终端用户感到沮丧,而且它真的很草率。

理想解决方案

理想情况下,用户在到达目的地后会自动登录到他们转移到的网站。所以:

  • 使用domain1.com
  • 中的用户帐户登录domain2.com
  • 获取弹出窗口解释您的错误并要求您更新书签
  • 自动转移到domain2.com并登录,就好像你已经去了那里一样。

原创方法

我们必须实现这一目标的第一个想法是重定向用户并向URL附加某种ID,并在到达新站点时获取相应的GET参数。虽然这有效,但我们可以记录人...这是非常不安全的。您基本上创建了一个令牌任何人可用于对该用户进行身份验证并将其传递到可能被拦截和冒充的线路上。

OpenID方法

我现在在想什么,我甚至不确定它是否会起作用(因此问题),就是使用OpenID的一些变体。 domain1.comdomain2.com都在我们的服务器上,由我们控制,并使用我们的SSL证书。我们拥有对数据库的完全访问权限,一旦我们知道要恢复的会话,就可以在网站重定向后重新登录后恢复用户的会话。

当我过去使用OpenID时,采用以下格式:

  1. 转到我要使用的网站A,然后点击登录
  2. 被重定向到站点B的登录页面,我已经拥有一个帐户
  3. 登录站点B并授予站点A使用我的信息的权限
  4. 重定向到Site A的经过身份验证的部分
  5. 我希望我们的系统能够复制该过程的步骤3-4。基本上是:

    1. 转到domain1.com并登录(您已有帐户)
    2. 阅读有关修复书签的消息,然后单击“确定”以重定向到正确的站点。
    3. 被重定向到domain2.com
    4. 的经过身份验证的部分

      到目前为止,我已经准备好了OpenID,这个似乎可能。现在我已经阅读了OpenID和OAuth几天来解决这个问题。但是我能找到的每个解决方案,教程和手册都描述了一个完全充实的OpenID服务器。我们不需要人们使用外部OpenID来对我们的系统进行身份验证,我们也不想成为OpenID提供商。我们只想创建一个符合上述描述的解决方案。

      那么,使用OpenID可以 吗?我们需要将协议的哪些部分充实才能使其有效?

1 个答案:

答案 0 :(得分:3)

您不一定需要OpenID将用户同时登录到多个域。您可以从domain1.com到domain2.com生成“签名重定向”,并将“断言”作为domain2.com网址上的参数之一

断言应包含userid,时间戳和使用domain1和domain2之间的共享密钥生成的签名。为了防止重放攻击,domain2应验证时间戳是否相对较新(10分钟)。应通过使用共享密钥对断言进行散列来生成签名。签名使domain2能够验证domain1是否生成了断言,假设共享密钥仅在domain1和domain2之间是已知的。

在较高的层面上,我所描述的机制相当于在SAML世界中产生“未经请求的断言”。 OpenID中理论上支持未经请求的断言,但我从未见过它在实践中实现过。

如果您之前没有实现过这种单点登录(SSO)技术,那么您应该非常小心,因为不正确的实现可能允许攻击者以任何用户身份登录到domain2。