3

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

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

4

1 回答 1

3

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

Waffle基本上是 JNA 调用 SSPI 的包装器。我们已经通过覆盖类成功地使用 Waffle 实现了 SSO 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 和 JNA JAR 一起复制到 JVM 的./jre/lib/endorsed中。使用 JVM 的Java Endorsed Standards Override Mechanism,这替换了 JVM 的默认Negotiator实现。

于 2012-08-17T12:36:09.707 回答