2012-05-23 5 views
6

Ich habe einen Linux \ java6-Client, der sich mit NTLM Sharepoint2010 authentifizieren und dann HTTP-REST-Webdienste mit Apache Commons HttpClient senden.Authentifizieren zu Sharepoint mit Kerberos von einem Java HttpClient

Ich kann dies mit NTLM tun, aber ich möchte die gleiche REST API verwenden, um Sharepoint 2010 zugreifen, die Kerberos Auth verwendet.

Beispiele zum Authentifizieren und Senden von REST über HTTP mit einem Kerberos-Sharepoint? (vorzugsweise unter Verwendung von HttpClient)

p.s. Ich habe keinen Zugriff auf Sharepoint-Code, aber ich habe Zugriff auf Sharepoint-Admin-Konfigurationen. Diese grob ist, wie ich mit NTLM authentifizieren:

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

Haben Sie bei http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html –

+0

sah es ist nicht genau das, was ich brauche, ich habe eine vorhandene api Ruhe Webdienste über http (org.apache.commons.httpclient.HttpClient), die mit NTLM arbeiten, und ich muss die SAME-Webdienste verwenden, wenn ich mit Kerberos auf Sharepoint-Servern arbeite. –

+0

Welcher Teil des Artikels, den ich erwähnte, wird ein Problem sein, in dem Sie das Ticket erhalten müssen, und ich bin nicht sicher, wie Sie das vorhaben. Es kann hilfreich sein, wenn Sie näher darauf eingehen. –

Antwort

3

Bitte bestätigen Sie, dass Ihre Umgebung für Kerberos richtig eingestellt ist, kann dies durch Ausführen von kinit erreicht werden. Wenn dies fehlschlägt, müssen Sie sicherstellen, dass Ihre krb5.ini (Windows) oder krb5.conf (linux) so eingerichtet ist, dass sie korrekt auf Ihren Domänencontroller verweist.

Sobald Sie bestätigt haben, dass Kerberos funktioniert, können Sie den Beispielcode von HttpClient wie unten eingefügt verwenden.

Bitte beachten Sie, dass es viele Probleme gibt, die Kerberos zum Scheitern bringen können, wie z. B. Zeitsynchronisierung, unterstützte Verschlüsselungstypen, Vertrauensbeziehungen zwischen Domänenforests und es ist auch wichtig, dass sich Ihr Client in einem separaten Feld befindet.

Hier ist der Beispielcode, der im HttpClient-Download verfügbar ist. Sie müssen sicherstellen, dass Ihre JAAS-Konfiguration und krb5.conf oder ini korrekt sind!

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

Ich habe keine Keytab und krb5.conf, muss ich sie auch definieren? Dies ist der sharepoint kerberos-URL, auf den ich zugreifen möchte: https://sp10-krb.qa.eng.mycompany.com/sites/mysite/myrestservice.aspx wird der kinit-Test sein: kinit [email protected] COM mein Passwort? –

+0

'krb5.conf' und' login.config' sind erforderlich.Wenn Ihr Client dann immer die gleiche Benutzeridentität verwendet, um eine Verbindung herzustellen, kann eine Schlüsseltabelle eine gute Idee sein, eine kinit Benutzer-/Passwortauthentifizierung mit dem Problem zu vermeiden, das Passwort irgendwo zu speichern. –

+0

Wo gebe ich den Hauptnamen und das Passwort ein, wenn ich kein Keytab verwende? –

Verwandte Themen