Java SSO:针对Active Directory的Kerberos身份验证

时间:2010-06-25 14:27:42

标签: java authentication active-directory single-sign-on kerberos

我仍在尝试为SSO(在* nix上运行)找到基于Java的解决方案,我可以在JBoss上使用它来针对Active Directory /域控制器进行授权。我最初尝试通过NTLM执行此操作,但放弃了因为Windows Server> = 2008不支持它。

因此,我正在尝试使用Kerberos实现此功能,但似乎无法找到正确/可行的解决方案。请指出正确的方向,说明如何设置此类配置,如何针对Active Directory和/或域控制器进行验证,以便:

  1. 查明帐户是否有效
  2. 获取用户的组列表
  3. 感谢任何帮助!


    更新

    我正在使用jcifs-ext-0.9.4和jcifs-krb5-1.3.12开发解决方案。我按如下所述设置了web.xml:

    <web-app>
      <!-- servlet / servlet-mapping / welcome-file-list skipped -->
    
     <filter>
     <filter-name>auth</filter-name>
     <filter-class>jcifs.http.AuthenticationFilter</filter-class>
    
     <init-param>
     <param-name>java.security.auth.login.config</param-name>
     <param-value>/WEB-INF/login.conf</param-value>
     </init-param>
    
     <init-param>
     <param-name>jcifs.spnego.servicePrincipal</param-name>
     <param-value>HTTP/testconn@mydomain.com</param-value>
     </init-param>
    
     <init-param>
     <param-name>jcifs.spnego.servicePassword</param-name>
     <param-value>supersecret</param-value>
     </init-param>
    
     <init-param>
     <param-name>sun.security.krb5.debug</param-name>
     <param-value>true</param-value>
     </init-param>
    
     <init-param>
     <param-name>java.security.krb5.realm</param-name>
     <param-value>mydomain.com</param-value>
     </init-param>
    
     <init-param>
     <param-name>java.security.krb5.kdc</param-name>
     <param-value>testdom01.mydomain.com </param-value>
     </init-param>
    
     <init-param>
     <param-name>jcifs.smb.client.domain</param-name>
     <param-value>TESTDOMAIN</param-value>
     </init-param>
    
     <init-param>
     <param-name>jcifs.http.enableNegotiate</param-name>
     <param-value>true</param-value>
     </init-param>
    
     <init-param>
     <param-name>jcifs.http.basicRealm</param-name>
     <param-value>mydomain.com</param-value>
     </init-param>
    
     <init-param>
     <param-name>jcifs.http.domainController</param-name>
     <param-value>testdom01.mydomain.com</param-value>
     </init-param>
    
     </filter>
     <filter-mapping>
     <filter-name>auth</filter-name>
     <url-pattern>/*</url-pattern>
     </filter-mapping>
    </web-app>
    

    如果尝试访问应用程序,则会导致以下堆栈跟踪:

    2010-07-22 15:53:10,588 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/google].[default]] Servlet.service() for servlet default threw exception
    java.lang.ArrayIndexOutOfBoundsException
            at java.lang.System.arraycopy(Native Method)
            at jcifs.ntlmssp.Type2Message.toByteArray(Type2Message.java:261)
            at jcifs.spnego.Authentication.processNtlm(Authentication.java:265)
            at jcifs.spnego.Authentication.process(Authentication.java:233)
            at jcifs.http.Negotiate.authenticate(Negotiate.java:46)
            at jcifs.http.AuthenticationFilter.doFilter(AuthenticationFilter.java:192)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
            at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
            at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
            at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
            at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
            at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
            at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
            at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
            at java.lang.Thread.run(Thread.java:619)
    

    感谢任何帮助。

5 个答案:

答案 0 :(得分:6)

为此,您实际上需要使用LDAP。幸运的是,Java对Kerberos和LDAP都有坚实的支持。详细程序位于http://java.sun.com/products/jndi/tutorial/ldap/security/gssapi.html

步骤概述: - 对Kerberos进行身份验证 - 使用Kerberos来假设用户身份 - 执行GSSAPI绑定到Active Directory LDAP服务器 - 通过LDAP检索组列表

答案 1 :(得分:1)

您可以使用Waffle。它是免费的,支持Negotiate,NTLM和Kerberos。您还可以使用它检查用户的组列表。

“WAFFLE - Windows身份验证功能框架(Light Edition)是一个本机C#和Java库,可以执行所有Windows身份验证(Negotiate,NTLM和Kerberos)。”

答案 2 :(得分:0)

我们使用Jespa来处理NTLM身份验证,我们已经在Tomcat和amp;在Solaris上运行的Glassfish,IE&amp; Firefox都受支持,而Chrome现在也支持NTLM。你需要一个商业用途的许可证,但我肯定会推荐它。

答案 3 :(得分:0)

当我尝试使用kerberos和JBoss时,我开始撰写一篇文章,计划是为初学者提供一个完整的指南,以便在JBoss中设置和使用kerberos。我并不是说这是一个完整的答案,但如果你提出问题我可以尝试回答它们并将它们添加到博客中。

the article

答案 4 :(得分:0)

如果要在计算机上调试kerberos,AD配置,则可以从以下链接下载应用程序。 https://github.com/shubham49/debugSSO 下载应用程序并将其部署在weblogic服务器上。 部署后打开主页,您将遇到不同的测试来调试配置。