简单的SSO – 使用自定义身份validation – CAS还是某些Oauth或openid服务器?

我想更多地了解解决单点登录的不同方式及其优缺点。 您是否使用过一个特定的解决方案,告诉我它有什么好处,并告诉我有哪些限制或次优部分。

以下是我想知道或不明白的细节。

SSO是一个巨大的主题,如维基百科中所列 。 我学的越多,我的问题就越多。

首先,我不了解CAS的令牌validation的必要性,它有什么用呢?

它更安全吗? 我猜它很容易受到像中国人一样的攻击。 客户还应该使用ssl吗?

让我们变得真实,这是我们的需求:如果已经在我们的某个应用程序中登录,则自动识别/登录用户。

  • my-php-app.com
  • my-java-app.com
  • my-ruby-app.com

(我们有很多webapps,用不同的语言编写)

我们希望(保留)我们自己的身份validation规则和用户存储,但可能会添加一些Oauth2提供程序,如facebook-connect。 我们希望它对用户来说简单易用,对于使用它的开发人员来说简单。

你会怎么做?

  • CAS?
  • OpenID的? 我可以用它进行集中认证吗?
  • 其他? 或者是OAuth服务器?

在客户端,您是否会使用iframe(如灯箱)来显示重定向的页面? 为什么/为什么不呢?


另一个与SSO相关的问题是: Saml经常(错误地)混入SSO讨论中 – 如果我这样说,我能理解吗?

当浏览器指向www.yetanother-myapp.com时,saml实现不会提供sso(自动登录)?


我研究过的一些相关的SO问题:

  • 使用CAS或OAuth进行SSO? – 他的需求描述不是我想要的,他描述了CAS ……
  • OpenID作为单点登录选项? – 好吧,我不确定从中学到了什么。

谢谢你教育我!

Oauth旨在对应用程序进行身份validation,以使其以用户的名义行事。 例如,Twitter客户端可以使用用户的帐户发布推文。 它可以用于Facebook显示的单点登录,但这需要一些额外的工作。

比较CAS和OpenID

CAS是具有一个帐户权限的集中式系统 。 OpenID是一个分布式系统 ,基本上任何人都可以设置身份提供者。 当然,您可以限制您的消费者只接受您自己的身份提供者。

OpenID有两个(不兼容的)标准,以提供有关帐户的其他属性 ,公共库或多或少地支持这些属性 。 在标准设置中,CAS仅提供用户名。 虽然CAS在理论上确实支持属性交换,但目前只有PHP客户端支持它 。

OpenID和CAS都可以自动登录 。 如果用户已登录,浏览器将立即重定向回您的应用程序。 但是,在简单的设置中,身份提供者将显示登录页面(如果用户未登录)。因此,如果您希望允许匿名访问您的身边,则需要人们单击专用登录链接。

幸运的是,OpenID和CAS都允许透明的登录尝试 。 在此模式下,不显示登录表单。 无论是否有身份validation信息,浏览器都会立即重定向回来。 换句话说:您可以在访问您的网站后立即将所有新用户(没有会话)重定向到身份提供商。 有一个很好的图表详细解释了这一点。 CAS将其称为“网关模式”,它通过将gateway = true附加到登录URL来实现。 在OpenID中,它被称为“立即模式”,URL参数是openid.mode = checkid_immediate

CAS支持单点注销 。 OpenID没有。

我个人的经验是CAS非常容易设置,并且非常可靠,所有常见的编程语言都有高质量的库。 OpenID有许多微小的不兼容性,因为它是一个复杂得多的系统。 但是,OpenID允许使用Google帐户。

答案

首先,我不了解CAS的令牌validation的必要性,它有什么用呢?

OpenID和CAS都要求您让身份提供者validation提供的令牌。 否则,攻击者可能能够创建自己的令牌或使用用户在注销之前创建的令牌。

客户还应该使用ssl吗?

是。

在客户端,您是否会使用iframe(如灯箱)来显示重定向的页面? 为什么/为什么不呢?

全屏重定向是最简单的事情。 我会从那开始让它运作起来。 许多应用程序要求在登录后重新加载当前页面,以便显示仅对登录用户可见的部分。

Iframe有一个问题,你需要在登录完成后摆脱它。 对于CAS,有一个关于如何 CAS登录表单直接嵌入到应用程序的HTML代码中的教程 。 另一个选择是显示像Facebook Connect那样的弹出窗口。

我之前可以回答一些关于CAS的问题。 我没有OAuth的经验,因此不会评论它。

首先,我不了解CAS的令牌validation的必要性,它有什么用呢?

CAS用于SSO目的。 当您有多个应用程序(不同TLD上的桌面应用程序/ Web应用程序)想要从单一来源进行身份validation时使用它。

它更安全吗? 我注意到它是基于重定向的,因此同样受到中间人攻击,就像没有额外令牌validation步骤的“自定义”auth服务器一样。 我缺少CAS中的安全性吗?

身份validation服务器使用SSL来防止MitM攻击。 但我不知道这是一个特定于SSO / CAS的问题,因为即使应用程序正在进行自己的身份validation,您也会遇到同样的问题。 也许您可以告诉我们您在CAS设置中担心哪种MitM攻击

令牌的目的是提供单点登出和/或超时吗? (我们不想要它,我们的用户会讨厌我们。)我一直在研究CAS,因为有一些很棒的Ruby实现,但我不确定它是我们需要的。

令牌只是应用程序无需密码即可对您进行身份validation的一种方式。 它们是与您的用户凭据关联的短寿命/单次使用的令牌。 应用程序将令牌提供给CAS服务器,CAS服务器使用凭证进行回复(如果有的话)。 可以实现单点登出和超时,但不能直接与令牌绑定。

我希望这很清楚。 我试图让它成为一个高级别的解释。 如果任何部分不清楚或者您想了解更多细节,请随时询问具体细节。

编辑:我在http://www.jasig.org/cas/proxy-authentication上找到了一个更好的简单解释CAS如何工作(页面的其余部分讨论代理身份validation。哪个更复杂,但前几段是我们在这里谈论的简单案例)

我转到我的Portal实例。 它将我重定向到CAS以登录。 CAS检测到我的安全cookie并执行单点登录,因此我不必再次提供用户名和密码。 CAS将我重定向回门户网站。 门户validation了票证,将我登录到Portal我看到我的默认布局中填充了一些很酷的频道,告诉我外面真的很冷,新闻中有什么。

请注意,门户网站没有获取我的密码。

这是基于我的经验:SSO(单点登录)与两种情况有关: – i)我非常了解你(涉及两方)ii)嘿朋友,见到我的朋友(涉及三方)

所以当然,第二种情况需要一种重定向/转发机制,因为通常第三方只是集中认证/授权服务。

现在,实施明智,SSO需要评估两个方面: –

a)不同的各方/系统(无论是内部/外部的组织)如何管理用户凭证。 这称为身份管理。

b)SSO信息应如何在各方之间流动? Ofcouse在大多数情况下都很安全。

我认为身份管理比确定如何传递信息更为关键,因为后者有许多可用的加密/解密技术。 它是一种独立管理,在一组启用SSO的系统中是不同的。

现在,身份管理可以通过简单的用户ID(如果所有参与系统都可用),或通过内部开发的XML内容,SAML有效负载或第三方令牌来实现。 我认为令牌只是一个通用术语,指的是以安全的方式包含用户凭证的容器,以及有关执行的某些安全程序的信息。

@Ole,已经说过关于SSO基础知识的所有内容(从我的角度来看),我认为你应该更多地关注如何在多个系统中识别用户及其角色,例如在你的情况下: – 你的用户存储,打开outh2提供商; 所以更多地考虑身份管理。

一个解决方案可能是(取决于您的预算和时间),您的企业可以花费精力以标准集成技术的forms创建内部集中身份validation接口,例如Web服务和这些API,您可以拥有任何实现:您自己的提供商或第三方oAuth或两者混合。 您可以在API和提供程序层(决策者)之间实现引擎层。 例如,引擎可以具有应用程序域和相应的auth提供程序映射。 这样,您将为其所有客户端提供统一的身份validation界面。

客户端 – >内部集中式API – >引擎 – > Auth提供程序让我举个例子: – i)您可以公开Webservice,命名可能是singleSigonService。 XML有效负载可能如下: –

 XYZ my-java-app.com ... ...  

ii)Web服务客户端将对集中式引擎层(在任何技术中实现)进行SSO调用,该层可以进行validation和簿记,并且可以基于源域(例如my-java-app.com)在传入XML中将请求委托给Oauth2提供商,如facebook-connect。 因此,您的引擎(决策者)将管理您在要求中提到的身份validation规则。

因此,基本上所有消费者应用程序都将拥有一个基于Web服务的统一界面来连接您的SSO解决方案。这就是我所说的内部集中式API。