2012-05-23 24 views
6

Ho un client linux \ java6 che autenticherà a sharepoint2010 con NTLM e quindi invierà servizi web REST HTTP utilizzando Apache Commons HttpClient.Autenticazione a sharepoint con kerberos da un HttpClient java

Posso farlo con NTLM, ma voglio utilizzare la stessa API REST per accedere a SharePoint 2010 che utilizza l'autenticazione Kerberos.

Qualche esempio su come autenticare e inviare REST su HTTP con uno sharepoint di Kerberos? (preferibilmente utilizzando HttpClient)

p.s. Non ho accesso al codice sharepoint, ma ho accesso alle configurazioni dell'amministratore di sharepoint. Questo è più o meno come mi autenticare con 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

Hai guardato http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html –

+0

suo non è esattamente quello che mi serve, ho un'API esistente di riposo servizi Web su http (org.apache.commons.httpclient.HttpClient) che funzionano con NTLM e ho bisogno di utilizzare i servizi web SAME quando si tratta di server sharepoint che utilizzano kerberos. –

+0

Quale parte dell'articolo che ho menzionato sarà un problema, in quanto è necessario ottenere il biglietto, e non sono sicuro di come pensi di farlo. Può essere d'aiuto se vai più in dettaglio. –

risposta

3

Si prega di confermare che l'ambiente è configurato correttamente per Kerberos, questo può essere realizzato eseguendo kinit. Se fallisce, devi assicurarti che il tuo krb5.ini (windows) o krb5.conf (linux) siano impostati in modo da puntare correttamente al tuo controller di dominio.

Dopo aver verificato che Kerberos è funzionante, è possibile utilizzare il codice di esempio da HttpClient come incollato di seguito.

Si noti che ci sono molti problemi che possono causare il fallimento di Kerberos, come la sincronizzazione dell'ora, i tipi di crittografia supportati, le relazioni di trust tra le foreste di domini e vale anche la garanzia che il client si trovi su una casella separata sul server.

Ecco il codice di esempio disponibile nel download HttpClient, è necessario assicurarsi che la configurazione di JAAS e krb5.conf o ini siano corretti!

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

Non ho un keytab e krb5.conf, devo anche definirli? questo è l'url kerberos di sharepoint a cui sto tentando di accedere: https://sp10-krb.qa.eng.mycompany.com/sites/mysite/myrestservice.aspx il test kinit sarà: kinit [email protected] COM mysppassword? –

+0

'krb5.conf' e' login.config' sono obbligatori.Quindi, se il client utilizza sempre la stessa identità utente per connettersi, un keytab può essere una buona idea evitare l'autenticazione utente/password kinit con il problema di memorizzare la password da qualche parte. –

+0

dove devo dare il nome e la password prinipipali se non uso keytab? –

Problemi correlati