![](/img/trans.png)
[英]Java Authentication against Active Directory, authentication mismatch?
[英]Java SSO: Kerberos authentication against Active Directory
我仍在尝试为 SSO(在 *nix 上运行)寻找基于 Java 的解决方案,我可以在 JBoss 上使用它来针对 Active Directory/域控制器进行授权。 我最初尝试通过 NTLM 执行此操作,但放弃了,因为 Windows Server >= 2008 不支持它。
因此,我正在尝试使用 Kerberos 来实现这一点,但似乎无法找到正确/有效的解决方案。 请指出正确的方向,解释如何设置此类配置,如何针对 Active Directory 和/或域控制器进行验证,以便:
任何帮助表示赞赏!
更新
我正在研究使用 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 。
步骤概述:
您可以使用华夫饼。 它是免费的,并支持 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.