Usando o SSPI para obter o SSO do aplicativo Java em execução no Windows

Eu tenho um aplicativo Java em execução no Windows que precisa se autenticar em uma aplicação web usando o Kerberos / SPNEGO. Estou ciente de como configurar o JAAS para conseguir isso, mas acho que a implementação do Kerberos Java (JDK6 e JDK7beta) não tem alguns resources importantes que eu preciso. Por exemplo, suporte para referências ou usando o DNS para descobrir o domínio de um host (eu tenho um ambiente multi-realm).

Existe um módulo de terceiros que pode implementar a autenticação usando o SSPI nativo do Windows? Já tivemos o trabalho de configurar nossos clientes Windows para trabalhar em nosso ambiente, seria bom não ter que fazer isso novamente para Java. Estou ciente do Waffle e do seu WindowsLoginModule, mas ele não parece fazer SSO, pois exige que os usuários insiram novamente suas credenciais no aplicativo.

Nós tivemos um problema semelhante. O principal problema para nós é que a implementação da API do GSS falha ao usar o Windows UAC e nós a resolvemos usando o Waffle.

Waffle é basicamente um invólucro para as chamadas do JNA para SSPI. Conseguimos implementar o SSO usando o Waffle substituindo a class 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]; } } 

Em seguida, você pode criar um JAR com apenas esta class e copiá-lo juntamente com os JARs do Waffle & JNA para ./jre/lib/endorsed da sua JVM. Usando o Mecanismo de Substituição de Padrões Endossados ​​por Java da JVM, isso substitui a implementação do Negotiator padrão da JVM.