跨域单选登录

5
我需要的并不是显式的跨域会话,但这是最容易解释我想要的东西的方式。
我有一个创建网站的系统。这些网站托管在许多不同的服务器上。
用户可以创建他们的帐户,然后他们可以创建许多网站。他们可以创建:
www.mysite.com subdomain.mysite.com 和创建许多不同的站点。
有时,网站将完全不同,但有时,这些网站实际上是如此密切相关,以至于它们应该被视为同一站点。
例如: (完全不同的域) mysite-news.com mysite-blog.com 或(相同的域,不同的子域) news.mysite.com blog.mysite.com
我需要一种方法,使用户能够在需要时创建某种联合体,通过点击复选框,允许跨站登录。除非是永久性更改且不会影响其他站点,否则我不能更改配置,因为会影响到数千个站点。
你认为支持这个的最佳方式是什么? OpenID,SSO?
我需要的是一些简单的东西,使站点能够创建一个“联合体”,然后允许他们的登录在跨域时生效。如果有人想加入,那么他们就可以。
4个回答

12

OpenID提供了一些不错的功能,但很遗憾,你所寻找的跨域行为并不是标准OpenID实现中的内容。 OpenID的主要设计原则之一是,在未经用户明确同意的情况下,提供者不会披露任何关于用户的信息*,因此,任何有信誉的OpenID提供者都不会在未经用户批准的情况下告诉mysite-news.com你已经登录到mysite-blog.com。

[从技术角度来看,这里正在发生的是mysite-news.com和mysite-blog.com在概念上属于同一个安全“领域”,但是OpenID通过URL模式识别域,由于它们位于不同的域上,因此不匹配。]

这并不能给你想要的用户体验。这里有一些先前的答案很好地概述了你在这里需要的系统类型:

简而言之,你需要在login.mysite.com上设置某种认证服务,以回答mysite-news.com和mysite-blog.com的查询。 在此过程中,仍然有一些方式可以利用OpenID。

  1. 在那里描述的重定向到登录并返回已签名令牌的流程正是OpenID所做的。因此,您仍然可以使用OpenID实现来执行所有已签名令牌和重放保护的管理,您的客户端站点只需跳过OpenID的最初的“发现”部分,并始终将用户重定向到login.mysite.com提供商。而login.mysite.com则可以跳过“我是否信任mysite-blog.com”的步骤,因为它是一个特殊目的的提供者,可以拥有自己的白名单,其中包含它始终使用的站点。在这里,OpenID将纯粹处于幕后,用户永远不会知道OpenID以某种方式参与其中。

  2. login.mysite.com反过来可以使用OpenID要求用户对其OpenID提供程序进行身份验证(无论是Google还是Yahoo或像myOpenID这样的专业提供商)。从那里看起来就像标准的OpenID登录,您会获得所有好处,缺点是您的登录重定向链变长了(相应地变慢了)。这就是生活。

祝你好运。这是一个相当频繁的问题,我还没有找到一个真正好的参考实现,可以让人们参考,因此如果您找到了好东西,请回来告诉我们。

最后,Matasano Chargen关于此主题的剧本的义务链接

[*] 最近的Google Buzz事件提醒我们,当你让用户感到惊讶时,他们会对信息分享对象产生怀疑。


3

SSO仅是一个概念/状态...它是您试图实现的内容。

OpenID适用于身份验证,适用于从多个站点进行身份验证。它不会将身份验证信息从一个站点带到另一个站点。

在我看来,行业标准SSO技术似乎是oAuth。它被Facebook、Twitter、Google等公司使用...

Google实施了一个混合协议,结合了OpenID和oAuth,他们试图将其推广为标准的身份验证方法。Google提供了一种联合登录解决方案,几乎与您提到的相同。

根据我的理解,您想要的解决方案是用户只需在其设置中勾选一个框即可在支持其帐户的所有位置进行登录...这违反了oAuth和OpenID背后的原则。我不知道当前是否有任何值得信赖的解决方案。

基本上现在所做的是,而不是使用OpenID提供的单个登录连接到每个站点...您使用OpenID帐户登录到站点,然后被重定向到oAuth授权请求。这将允许oAuth服务器在将来对该站点进行身份验证,直到撤销权限为止,只要您使用OpenID帐户与该oAuth服务进行身份验证。


2

谢谢。 我认为我更喜欢OpenID的实现方式。 我计划添加支持Facebook Connect,这样用户也可以使用它来登录。 这不应该是个问题,对吧? - Layke

2
如@keturn所解释的,OpenID不允许在没有欺骗系统的情况下进行隐式信任,这就是为什么我不建议在这个特定问题上使用它。相反,我会看看Shibboleth - 一个用于分散式架构的单点登录系统。
假设网站master.example.com与网站child.example.com相链接,因此master.example.comchild.example.com提供登录功能。现在,已在master.example.com注册登录的用户想要访问一个成员专属资源http://child.example.com/resource。这时,Shiboleth开始发挥作用:
认证:用户是否拥有安全令牌?
  • 如果用户已经从master.example.com获得了安全令牌,则检查其有效性并继续进行步骤2。
  • 如果用户没有有效的令牌,则会被转发到登录站点,例如http://master.example.com/login。登录后,用户将被转发到步骤1。
授权(可选): master.example.com 可能通过提供附加信息来允许或拒绝访问 child.example.com 上的特定资源(例如,child.example.com 上的特定论坛仅对 master.example.com 的高级会员可用。用户的成员状态信息仅对 master.example.com 可见,因此他必须允许或拒绝访问)。
许多服务(例如apache2)或应用程序层面(例如php中的SimpleSAML)都提供了Shibboleth实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接