2012-05-23 23 views
6

Mam klienta linux \ java6, który uwierzytelni się do sharepoint2010 za pomocą NTLM, a następnie wyśle ​​usługi HTTP REST za pomocą Apache Commons HttpClient.Uwierzytelnianie punktu akcji za pomocą Kerberos z java HttpClient

Mogę to zrobić z NTLM, ale chcę użyć tego samego interfejsu API REST, aby uzyskać dostęp do programu sharepoint 2010, który używa uwierzytelniania Kerberos.

Dowolne przykłady uwierzytelniania i wysyłania usług REST za pośrednictwem protokołu HTTP za pomocą punktu współużytkowania Kerberos? (korzystnie przy użyciu HttpClient)

p.s. Nie mam dostępu do kodu sharepoint, ale mam dostęp do konfiguracji administratora programu SharePoint. To jest mniej więcej jak ja uwierzytelniania NTLM:

HttpClient httpClient = new HttpClient(new SimpleHttpConnectionManager(true)); 
AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, JCIFS_NTLMScheme.class); 
String localHostName = Inet4Address.getLocalHost().getHostName(); 
authscope = new AuthScope(uri.getHost(), AuthScope.ANY_PORT); 
httpClient.getState().setCredentials(authscope,new NTCredentials(
      getUsername(),getPassword(),localHostName,getDomain())); 

// after the initial ntlm auth I can call my REST service with "httpClient.executeMethod" 

int status = httpClient.executeMethod(new GetMethod(accessURI + "/sitecollection/info")); 
+1

Czy spojrzał na http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html –

+0

jej nie dokładnie to, co muszę, mam istniejącego api odpoczynku usługi sieciowe przez http (org.apache.commons.httpclient.HttpClient), które działają z NTLM, i potrzebuję korzystać z usług SAME webservices podczas pracy z serwerami sharepoint używającymi Kerberos. –

+0

Która część artykułu, o którym wspomniałem, będzie problemem, ponieważ musisz zdobyć bilet i nie jestem pewien, jak to zaplanujesz. Może pomóc, jeśli zajmiesz się bardziej szczegółami. –

Odpowiedz

3

Proszę potwierdzić, że środowisko jest prawidłowo ustawiony dla Kerberos, można to osiągnąć uruchamiając kinit. Jeśli to się nie powiedzie, musisz upewnić się, że twoje krb5.ini (Windows) lub krb5.conf (Linux) są skonfigurowane tak, aby wskazywały poprawnie kontroler domeny.

Po potwierdzeniu, że protokół Kerberos działa, można użyć przykładowego kodu z HttpClient wklejonego poniżej.

Należy pamiętać, że istnieje wiele problemów, które mogą spowodować awarię protokołu Kerberos, takich jak synchronizacja czasu, obsługiwane typy szyfrowania, relacje zaufania między lasami domeny, a ponadto warto zadbać o to, aby klient znajdował się w osobnym polu na serwerze.

Oto przykład kodu, który jest dostępny w pobraniu HttpClient, musisz upewnić się, że konfiguracja JAAS i krb5.conf lub ini są poprawne!

public class ClientKerberosAuthentication { 

    public static void main(String[] args) throws Exception { 

     System.setProperty("java.security.auth.login.config", "login.conf"); 
     System.setProperty("java.security.krb5.conf", "krb5.conf"); 
     System.setProperty("sun.security.krb5.debug", "true"); 
     System.setProperty("javax.security.auth.useSubjectCredsOnly","false"); 

     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     try { 
      httpclient.getAuthSchemes().register(AuthPolicy.SPNEGO, new SPNegoSchemeFactory()); 

      Credentials use_jaas_creds = new Credentials() { 

       public String getPassword() { 
        return null; 
       } 

       public Principal getUserPrincipal() { 
        return null; 
       } 

      }; 

      httpclient.getCredentialsProvider().setCredentials(
        new AuthScope(null, -1, null), 
        use_jaas_creds); 

      HttpUriRequest request = new HttpGet("http://kerberoshost/"); 
      HttpResponse response = httpclient.execute(request); 
      HttpEntity entity = response.getEntity(); 

      System.out.println("----------------------------------------"); 
      System.out.println(response.getStatusLine()); 
      System.out.println("----------------------------------------"); 
      if (entity != null) { 
       System.out.println(EntityUtils.toString(entity)); 
      } 
      System.out.println("----------------------------------------"); 

      // This ensures the connection gets released back to the manager 
      EntityUtils.consume(entity); 

     } finally { 
      // When HttpClient instance is no longer needed, 
      // shut down the connection manager to ensure 
      // immediate deallocation of all system resources 
      httpclient.getConnectionManager().shutdown(); 
     } 
    } 

} 
+0

Nie mam keytab i krb5.conf, czy muszę je również zdefiniować? to jest adres URL kerberos sharepointu, który próbuję uzyskać dostęp: https://sp10-krb.qa.eng.mycompany.com/sites/mysite/myrestservice.aspx będzie testem kinit: kinit [email protected] Hasło mySP COM? –

+0

'krb5.conf' i' login.config' są wymagane.Następnie, jeśli twój klient zawsze używa tej samej tożsamości użytkownika do połączenia, keytab może być dobrym pomysłem, aby uniknąć uwierzytelniania użytkownika/hasła kinit z trudnością do przechowywania hasła gdzieś. –

+0

gdzie mogę podać główną nazwę i hasło, jeśli nie używam keytab? –

Powiązane problemy