2012-05-23 2 views
6

У меня есть клиент linux \ java6, который будет аутентифицироваться на sharepoint2010 с помощью NTLM, а затем отправлять HTTP-службы REST с помощью Apache Commons HttpClient.Аутентификация sharepoint с кеберосами из java HttpClient

Я могу сделать это с помощью NTLM, но я хочу использовать тот же REST API для доступа к sharepoint 2010, который использует kerberos auth.

Любые примеры аутентификации и отправки REST через HTTP с помощью sharepoint kerberos? (предпочтительно с использованием HttpClient)

p.s. У меня нет доступа к коду sharepoint, но у меня есть доступ к настройкам администратора sharepoint. Это примерно как я аутентификации 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

Вы смотрели на http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html –

+0

его не совсем то, что мне нужно, у меня есть существующий апи отдыха веб-сервисы через http (org.apache.commons.httpclient.HttpClient), которые работают с NTLM, и мне нужно использовать SAME webservices при работе с серверами sharepoint с использованием кеберосов. –

+0

Какая часть статьи, о которой я упоминал, будет проблемой, поскольку вам нужно получить билет, и я не уверен, как вы планируете это делать. Это может помочь, если вы перейдете к более подробным сведениям. –

ответ

3

Пожалуйста, подтвердите, что среда правильно настроен для Kerberos, это может быть достигнуто путем запуска Kinit. Если это не удается, вам необходимо убедиться, что ваши krb5.ini (windows) или krb5.conf (linux) настроены правильно на ваш контроллер домена.

Как только вы подтвердите, что Kerberos является функциональным, вы можете использовать пример кода из HttpClient, как показано на рисунке ниже.

Обратите внимание, что существует множество проблем, которые могут привести к сбою Kerberos, таких как синхронизация времени, поддерживаемые типы шифрования, доверительные отношения в лесах доменов, а также гарантировать, что ваш клиент находится на отдельном ящике на сервере.

Вот пример кода, который доступен в загрузке HttpClient, вам необходимо убедиться, что ваша конфигурация JAAS и krb5.conf или ini верны!

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

У меня нет keytab и krb5.conf, мне также нужно их определить? это URL-адрес sharepoint kerberos, к которому я пытаюсь получить доступ: https://sp10-krb.qa.eng.mycompany.com/sites/mysite/myrestservice.aspx будет проходить тест kinit: kinit [email protected] COM mysppassword? –

+0

'krb5.conf' и' login.config'.Затем, если ваш клиент всегда использует один и тот же идентификатор пользователя для подключения, keytab может быть полезен, чтобы избежать аутентификации пользователя/пароля kinit с проблемой хранения пароля где-то. –

+0

Где я могу назвать имя и пароль, если я не использую keytab? –