Single sign on 无Windows登录的富客户端(“胖客户端”)单点登录

Single sign on 无Windows登录的富客户端(“胖客户端”)单点登录,single-sign-on,kerberos,saml,fat-client,Single Sign On,Kerberos,Saml,Fat Client,web应用程序(通过浏览器使用)的单点登录(SSO)已经有了很好的文档记录并已建立。为富客户端建立SSO比较困难,通常建议基于Kerberos票证,特别是使用Windows登录到域中的ActiveDirectory 然而,我正在寻找一个更通用的解决方案,用于以下方面:我需要建立“真正的”SSO(所有应用程序都有一个标识,即不只是跨应用程序的密码同步),在客户端(非托管计算机,包括非Windows),“最终客户端”是Java应用程序和GTK+应用程序。两者都使用基于HTTP的协议(例如,HTTPS

web应用程序(通过浏览器使用)的单点登录(SSO)已经有了很好的文档记录并已建立。为富客户端建立SSO比较困难,通常建议基于Kerberos票证,特别是使用Windows登录到域中的ActiveDirectory

然而,我正在寻找一个更通用的解决方案,用于以下方面:我需要建立“真正的”SSO(所有应用程序都有一个标识,即不只是跨应用程序的密码同步),在客户端(非托管计算机,包括非Windows),“最终客户端”是Java应用程序和GTK+应用程序。两者都使用基于HTTP的协议(例如,HTTPS上的Web服务)与服务器通信。客户机和服务器不一定位于同一LAN/Intranet中,但客户机可以从外部网访问服务器。所有应用程序的服务器端都位于同一网络区域中,SSO组件可以通过LDAP访问身份提供程序

我的问题基本上是“我怎么做?”?更具体地说

a) 对于安全、受保护的客户端“sso会话存储”,是否有一种商定的机制,就像浏览器访问的应用程序的sso cookie一样?可能是模拟Kerberos(TGT?)或者甚至在客户端没有执行ActiveDirectory身份验证的情况下直接重新使用它

b) 富客户机和SSO的其他参与者之间是否有任何通信协议/API/框架(就像cookie一样)

c) 是否有任何API/框架用于在网络上推送kerberos(如TGT和会话票证)

d) 是否有演示如何执行富客户端SSO的示例实现/教程

据我所知,有些“填写”代理学习将凭据输入客户端的应用程序对话。如果可能的话,我宁愿不使用这样的“助手”

此外,如果可能的话,我希望尽可能使用CAS、Shibboleth和其他开源组件

感谢您的评论、建议和回答


MiKu

使用AD帐户是通用的解决方案。Kerberos无处不在。这是唯一一种在登录时要求您提供一次凭据的机制

这些都是可行的,您需要:

  • KDC
  • 更正DNS条目
  • KDC帐户
  • 正确的SPN条目
  • 配置为与KDC对话的客户端计算机
  • Java应用程序使用JAAS和JGSS获取服务票证
  • GSS-API与您的GTK+应用程序一起获得服务票

  • 您自己发现了什么?

    同意Michael的观点,即您希望使用GSSAPI/Kerberos。但是,我要补充的是,Java有一个障碍:默认情况下,JGSS使用自己的GSSAPI和Kerberos实现,在JDK中用Java编写,而不是使用平台的库。因此,它不符合您现有的配置,也不像其他任何东西一样工作(例如,在Unix上,它不尊重KRB5CCNAME或您习惯的其他环境变量,不能使用DNS来定位KDC,具有不同的支持密码集,等等)。它也是有车的和有限的;例如,它不能跟随推荐

    在Unix平台上,您可以通过以下方式启动JVM,让JGSS绕过JDK代码并使用外部GSSAPI库:

    -Dsun.security.jgss.native=true -Dsun.security.jgss.lib=/path/to/libgssapi_krb5.so
    
    然而,Windows上没有类似的选项来使用SSPI。这看起来很有希望:


    。。。但是我还没有解决这个问题。

    谢谢Michael-O,如果客户端计算机有ActiveDirectory帐户(即登录时生成Kerberos票证的帐户),这听起来不错,但是我还想介绍一下不是这种情况的客户端。换句话说,我不想对客户机做任何假设,但我想以可靠的方式检索和“共享”TGT(例如Kerberos票证)。如果以特定于平台的方式执行此操作,则是可以接受的,因为Kerberos存储的访问方式可能不同。有什么方法/技术/API可以做到这一点吗?您是在托管intranet环境中还是在Internet上?所有托管客户端都有Kerberos票证。但是我需要考虑那些可以通过VPN访问网络的客户端,因此它们既不是受管理的,也不一定是Windows。我不知道您的通信协议是什么样子,但您可以提供多个身份验证选项:GSS-API=>Basic/Digest。第一个用于域用户,第二个用于检查数据库。如果您将此方案应用于HTTP,它的意思就是:
    WWW-Authenticate:Negotiate
    WWW-Authenticate:Basic