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

时间:2011-05-14 14:41:15

标签: java ruby oauth single-sign-on cas

  

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

     

下面   是我想要的细节   知道,或者不明白。

SSO是一个很大的主题,listed in the wikipedia。我越了解我的问题就越多。

首先,我不理解CAS令牌验证的必要性,它有什么用?

它更安全吗?我想它很容易受到中间人攻击的影响。客户还应该使用ssl吗?

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

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

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

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

你会做什么?

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

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


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

  

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


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

感谢教育我!

3 个答案:

答案 0 :(得分:24)

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

比较CAS和OpenID

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

OpenID有两个(不兼容的)标准,可以提供有关该帐户的附加属性,这些标准或多或少受到公共库的支持。在标准设置中,CAS仅提供用户名。虽然CAS确实在理论上支持属性交换,但目前only the PHP client supports it

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

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

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

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

答案

  

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

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

  

客户还应该使用ssl吗?

  

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

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

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

答案 1 :(得分:7)

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

  

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

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

  

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

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

  

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

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

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

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

  

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

     

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

答案 2 :(得分:0)

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

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

现在,实施方面,SSO需要评估两个方面: -

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

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

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

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

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

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

客户 - >内部集中式API - >引擎 - >认证提供商 让我举个例子: - i)您可以公开Webservice,命名可能是singleSigonService。 XML有效负载可能类似于: -

<SingleSignOnReqType>   <sourceID>XYZ</sourceID>    <source-domain>my-java-app.com</source-domain>  <user-credentials>...</<user-credentials>
        <security-credentials>...</<security-credentials> </SingleSignOnReqType>

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

所以基本上所有的消费者应用程序都会有一个基于Web服务的统一界面来解决你的SSO解决方案。这就是我所说的内部集中式API。