java - 简单 SSO - 使用自定义身份验证 - CAS 或一些 Oauth 或 openid 服务器?

标签 java ruby oauth single-sign-on cas

I'd like to know more about the different ways of solving Single Sign-On and their pros and cons. Have you worked with one particular solution, tell me what's good about it and tell me what the limitations or suboptimal parts are.

Below are the details of what I'd like to know, or don't understand.

SSO 是一个巨大的话题,如 listed in the wikipedia .我学得越多,我的问题就越多。

首先,我不明白 CAS 的 token 验证的必要性。 ,有什么用呢?

它更安全吗? 我猜它很容易受到中间人攻击。客户端也应该使用 ssl 吗?

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

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

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

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

你会怎么做?

  • CAS?
  • Openid?我可以使用它进行集中身份验证吗?
  • 其他?还是使用 OAuth 的服务器?

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


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

a saml implementation would not provide sso (autologin) when pointing the browser to www.yetanother-myapp.com?


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

谢谢你教育我!

最佳答案

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

比较 CAS 和 OpenID

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

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

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

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

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

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

答案

First of all, I don't understand the need for token verifications of CAS, what is it good for?

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

Should clients also use ssl?

是的。

On the client side, would you use an iframe, like lightbox, to show the redirected page? Why/Why not?

一个完整的屏幕重定向是最简单的事情。我会从它开始让它工作。无论如何,许多应用程序都需要在登录后重新加载当前页面,以显示仅对登录用户可见的部分。

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

关于java - 简单 SSO - 使用自定义身份验证 - CAS 或一些 Oauth 或 openid 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6002519/

相关文章:

ruby - 如何在postgres中通过json列使用rom-sql查询记录?

azure - AADSTS70007 : 'query' is not a supported value of 'response_mode' when requesting a token

php - OAuth2 : Error 401 Unauthorized at PHP request with access_token (Discord API)

java - Android 未报告的异常 IOException 错误

java - 格式化输出,保留三位小数

java catch 进程时间实时进度条

python - 关于 Github OAuth 身份验证

java - retrofit转换为json字符串时出现Conversion Exception如何解决

ruby-on-rails - 如何在 erb 中使用带有枚举的 block

ruby - 使用 Nokogiri 的 XML 标记内的无效响铃字符