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

时间:2010-08-26 22:35:31

标签: java windows kerberos jaas

我在Windows上运行的Java应用程序需要使用Kerberos / SPNEGO对webapp进行身份验证。我知道如何配置JAAS来实现这一点,但我发现Java(JDK6和JDK7beta)Kerberos实现缺少一些我需要的重要功能。例如,支持引用或使用DNS来确定主机的领域(我有一个多领域环境)。

是否有可以使用Windows原生SSPI实现身份验证的第三方模块?我们已经遇到了将我们的Windows客户端配置为在我们的环境中工作的麻烦,不必再为Java做这件事。我知道Waffle及其WindowsLoginModule,但它似乎没有进行SSO,因为它要求用户将其凭据重新输入应用程序。

1 个答案:

答案 0 :(得分:3)

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

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& amp; JNA JAR到你的JVM的 ./jre / lib / endorsed 。使用JVM的Java Endorsed Standards Override Mechanism,这将取代JVM的默认Negotiator实现。