簡體   English   中英

Java SSO:針對 Active Directory 的 Kerberos 身份驗證

[英]Java SSO: Kerberos authentication against Active Directory

我仍在嘗試為 SSO(在 *nix 上運行)尋找基於 Java 的解決方案,我可以在 JBoss 上使用它來針對 Active Directory/域控制器進行授權。 我最初嘗試通過 NTLM 執行此操作,但放棄了,因為 Windows Server >= 2008 不支持它。

因此,我正在嘗試使用 Kerberos 來實現這一點,但似乎無法找到正確/有效的解決方案。 請指出正確的方向,解釋如何設置此類配置,如何針對 Active Directory 和/或域控制器進行驗證,以便:

  1. 查明帳戶是否有效以及
  2. 獲取用戶的組列表

任何幫助表示贊賞!


更新

我正在研究使用 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)

任何幫助表示贊賞。

為此,您實際上需要使用 LDAP。 幸運的是,Java 對 Kerberos 和 LDAP 都有可靠的支持。 詳細過程位於http://java.sun.com/products/jndi/tutorial/ldap/security/gssapi.html

步驟概述:

  • 對 Kerberos 進行身份驗證
  • 使用 Kerberos 來承擔用戶身份
  • 執行 GSSAPI 綁定到 Active Directory LDAP 服務器
  • 通過 LDAP 檢索組列表

您可以使用華夫餅 它是免費的,並支持 Negotiate、NTLM 和 Kerberos。 您還可以使用它檢查用戶的組列表。

“WAFFLE - Windows 身份驗證功能框架(精簡版)是一個本機 C# 和 Java 庫,可以完成所有 Windows 身份驗證(協商、NTLM 和 Kerberos)。”

我們使用Jespa來處理 NTLM 身份驗證,我們已經在 Solaris 上運行的 Tomcat 和 Glassfish 上進行了測試,同時支持 IE 和 Firefox,而且 Chrome 現在也支持 NTLM。 雖然您需要商業用途的許可證,但我肯定會推薦它。

如果您想在您的機器上調試 kerberos、AD 配置,那么您可以從以下鏈接下載該應用程序。 https://github.com/shubham49/debugSSO下載應用程序並將其部署在 weblogic 服務器上。 部署后打開主頁,您將遇到不同的測試來調試配置。

我在嘗試使用 kerberos 和 JBoss 時開始寫一篇文章,計划是為初學者提供一個完整的指南來設置和使用 kerberos 和 JBoss。 我並不是說這是一個完整的答案,但是如果您提出問題,我可以嘗試回答它們並將它們添加到博客中。

文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM