使用SSPI从Windows上运行的Java应用程序获取SSO

我有一个在Windows上运行的Java应用程序,需要使用Kerberos / SPNEGO进行身份validation。 我知道如何configurationJAAS来实现这一目标,但是我发现Java(JDK6和JDK7beta)Kerberos实现缺less一些我需要的重要function。 例如,支持推荐或使用DNS来找出主机的领域(我有一个多领域的环境)。

是否有第三方模块可以使用Windows本机SSPI来实现身份validation? 我们已经经历了configuration我们的Windows客户端在我们的环境中工作的麻烦,不用再为Java做这件事了。 我知道Waffle和它的WindowsLoginModule,但它似乎没有做SSO,因为它要求用户重新input他们的凭据到应用程序中。

我们有类似的问题。 我们面临的主要问题是使用Windows UAC时,GSS-API实现失败,我们使用Waffle解决了这个问题。

华夫饼基本上是JNA呼吁SSPI的包装。 我们设法通过覆盖类sun.net.www.protocol.http.NegotiatorImpl使用Waffle来实现SSO:

 package sun.net.www.protocol.http; import java.io.IOException; import waffle.windows.auth.impl.WindowsSecurityContextImpl; public class NegotiatorImpl extends Negotiator { private String serviceName; public NegotiatorImpl(HttpCallerInfo hci) throws IOException { this.serviceName = "HTTP/" + hci.host.toLowerCase(); } @Override public byte[] firstToken() throws IOException { return WindowsSecurityContextImpl.getCurrent("Negotiate", serviceName).getToken(); } @Override public byte[] nextToken(byte[] in) throws IOException { return new byte[0]; } } 

然后,您可以创建一个仅包含此类的JAR,并将其与Waffle和JNA JAR一起复制到JVM的./jre/lib/endorsed 。 使用JVM的Java认可的标准覆盖机制 ,这取代了JVM的默认Negotiator实现。