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

我有一个运行在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的默认协商器实现.

上一篇:0473-如何使用Python3访问Kerberos环境的Hive和Impala


下一篇:列类型的选择