Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java跨不同域单点登录[SSO]_Java_Authentication_Servlets_Single Sign On_Multiple Domains - Fatal编程技术网

使用Java跨不同域单点登录[SSO]

使用Java跨不同域单点登录[SSO],java,authentication,servlets,single-sign-on,multiple-domains,Java,Authentication,Servlets,Single Sign On,Multiple Domains,我们正在跨多个应用程序实施单点登录[SSO],这些应用程序托管在不同的域和不同的服务器上 现在,如图所示,我们将介绍一个身份验证服务器,它实际上与LDAP交互并对用户进行身份验证。这些应用程序将用于/对话对服务器进行身份验证,它们托管在不同的服务器和域中 对于SSO,我不能使用会话变量,因为有不同的服务器、不同的应用程序、不同的域,域级别的cookie/会话变量没有帮助 我正在寻找一个更好的解决方案,可以用于跨他们的SSO。是否存在任何已演示的实现?如果是这样的话,请把它贴出来或给我指出正确的

我们正在跨多个应用程序实施单点登录[SSO],这些应用程序托管在不同的域和不同的服务器上

现在,如图所示,我们将介绍一个身份验证服务器,它实际上与LDAP交互并对用户进行身份验证。这些应用程序将用于/对话对服务器进行身份验证,它们托管在不同的服务器和域中

对于SSO,我不能使用会话变量,因为有不同的服务器、不同的应用程序、不同的域,域级别的cookie/会话变量没有帮助


我正在寻找一个更好的解决方案,可以用于跨他们的SSO。是否存在任何已演示的实现?如果是这样的话,请把它贴出来或给我指出正确的方向。

您不能使用Rest服务

您可以使用我所称的参考Url身份验证 假设您在www.AAAA.com上运行身份验证应用程序 在要进行身份验证的应用程序中,
您可以使用一个过滤器在其域中查找经过身份验证的cookie,否则将重定向到www.AAAA.com进行身份验证


Successfull authentication
上,您可以
将用户配置文件信息作为加密的GET/POST数据传递回应用程序

您可以通过在auth服务器上进行所有登录来实现这一点。其他应用程序可以通过后台通道与身份验证服务器通信。一般原则如下:

  • 用户访问应用程序1
  • 应用程序1需要用户登录,因此它通过后台通道向身份验证服务器发送令牌。然后,应用程序1将用户重定向到身份验证服务器上的登录页面,并将令牌作为请求的参数
  • 用户登录到身份验证服务器。Auth server设置cookie,将令牌标记为已验证,并将用户详细信息与其关联。然后,身份验证服务器将用户重定向回应用程序1
  • 应用程序1从用户处获取请求,并通过后台通道调用auth server以检查令牌是否正常。使用用户详细信息验证服务器响应
  • 应用程序1现在知道用户已获得授权,并拥有一些基本的用户详细信息
  • 这就是SSO位的作用:

  • 用户访问应用程序2
  • 应用程序2需要用户登录,因此它通过后台通道向身份验证服务器发送令牌。然后,应用程序2将用户重定向到身份验证服务器上的登录页面,并将令牌作为请求的参数
  • Auth server可以看到cookie中有一个有效的日志,因此它可以判断用户已经通过身份验证,并且知道他们是谁。Auth server将令牌标记为已验证,并将用户详细信息与其关联。然后,身份验证服务器将用户重定向回应用程序2
  • 应用程序2从用户处获取请求,并通过后台通道调用auth server以检查令牌是否正常。使用用户详细信息验证服务器响应
  • 应用程序2现在知道用户已获得授权,并拥有一些基本的用户详细信息

  • 此方法有一些现有的实现,例如(中央身份验证服务)。请注意,在中,CAS受开箱即用支持。我建议您考虑使用现有的实现,因为编写自己的实现将很困难。在我的回答中,我已经简化了一些事情,如果您是新手,那么引入安全漏洞的可能性很大。

    更大的问题是您如何实现单点登录。许多开源甚至专有(IBM Tivoli)产品都提供了跨域单点登录功能。这将是实现跨域sso的最简单和最好的方法。您可以配置在所选sso服务器中使用的LDAP服务器

    以OpenSSO为例,下面是一篇配置跨域单点登录的文章

    要在开放式sso中配置LDAP,

    关于这个问题的参考资料在这里以一个简洁的图表呈现

    根据您使用的产品,您可以配置跨域单点登录

    这样,您的关系图将如下所示,auth服务器是您与所选sso服务器交互的实用工具

    拥有与sso通信的身份验证服务器是一个可靠的体系结构原则。我建议调用REst端点进行身份验证,这些端点可以通过http从不同的应用程序调用


    我会建议您查看OAuth。它是一个很好的身份验证和授权协议,被包括facebook、google、windows live和其他大型组织使用。它可能有一个初始学习曲线,但它是一个生产级解决方案

    它还有Java、Ruby、PHP和一系列其他编程语言的库

    例如,以下服务器端实现可用于Java

    • 阿帕奇琥珀色(草案22)
    • OAuth的Spring安全性
    • API授权服务器(v2-31)
    • Restlet框架(草案30)
    • ApacheCXF
    还提供了以下客户端Java库:

    • 阿帕奇琥珀色(草案22)
    • 春季社交
    • OAuth的Spring安全性
    • Restlet框架(草案30)
    请参阅此处了解更多详细信息:


    自从我构建了一个Java应用程序以来,我一直在为它寻找SSO解决方案。我发现了一个免费的JavaSAML连接器,您可以使用它在使用任何Java框架构建的基于Java的应用程序中实现SSO


    这里是它的链接-

    我计划使用REST/WebService。我关心的是1。如何知道用户已登录?如果我有公共域,会话变量可以用于维护数据。但若我们使用多个域,我如何知道用户是否已经登录第二种方法,你们有任何这样的工作教程吗