我在Windows上运行的Java应用程序需要使用Kerberos / SPNEGO对webapp进行身份验证。我知道如何配置JAAS来实现这一点,但我发现Java(JDK6和JDK7beta)Kerberos实现缺少一些我需要的重要功能。例如,支持引用或使用DNS来确定主机的领域(我有一个多领域环境)。
是否有可以使用Windows原生SSPI实现身份验证的第三方模块?我们已经遇到了将我们的Windows客户端配置为在我们的环境中工作的麻烦,不必再为Java做这件事。我知道Waffle及其WindowsLoginModule,但它似乎没有进行SSO,因为它要求用户将其凭据重新输入应用程序。
答案 0 :(得分:3)
我们遇到了类似的问题。我们面临的主要问题是使用Windows UAC时GSS-API实现失败,我们使用Waffle解决了它。
Waffle基本上是JNA调用SSPI的包装器。我们已经设法通过覆盖类sun.net.www.protocol.http.NegotiatorImpl
:
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& amp; JNA JAR到你的JVM的 ./jre / lib / endorsed 。使用JVM的Java Endorsed Standards Override Mechanism,这将取代JVM的默认Negotiator
实现。