我有一个运行在Windows上的Java应用程序,该应用程序需要使用Kerberos / SPNEGO验证到Web应用程序.我知道如何配置JAAS来实现此目的,但是我发现Java(JDK6和JDK7beta)Kerberos实施缺少我需要的几个重要功能.例如,支持引用或使用DNS确定主机的领域(我有一个多领域环境).
是否存在可以使用Windows本机SSPI实施身份验证的第三方模块?我们已经遇到了将Windows客户端配置为在我们的环境中工作的麻烦,不必为Java再次执行该操作就很好了.我知道Waffle及其WindowsLoginModule,但它似乎没有执行SSO,因为它要求用户将其凭据重新输入到应用程序中.
解决方法:
我们有一个类似的问题.我们的主要问题是,使用Windows UAC时,GSS-API实现失败,而我们使用Waffle解决了该问题.
Waffle基本上是对SSPI的JNA调用的包装.我们通过覆盖类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& JVM的./jre/lib/认可的JNA JAR.使用JVM的Java Endorsed Standards Override Mechanism,它将替换JVM的默认协商器实现.