2012-05-23 40 views
6

Tôi có một máy khách linux \ java6 sẽ xác thực với sharepoint2010 với NTLM và sau đó gửi các dịch vụ web REST HTTP bằng cách sử dụng Apache Commons HttpClient.Xác thực với sharepoint với kerberos từ một java HttpClient

Tôi có thể thực hiện việc này với NTLM, nhưng tôi muốn sử dụng cùng một API REST để truy cập vào SharePoint 2010 sử dụng xác thực kerberos.

Bất kỳ ví dụ nào về cách xác thực và gửi REST qua HTTP bằng trình chia sẻ kerberos? (tốt nhất là sử dụng HttpClient)

p.s. Tôi không có quyền truy cập vào mã sharepoint, nhưng tôi có quyền truy cập vào cấu hình quản trị viên SharePoint. Đây là khoảng cách tôi xác thực với 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

Các bạn đã nhìn http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html –

+0

của nó không chính xác những gì tôi cần, tôi có một api hiện có của phần còn lại các dịch vụ web trên http (org.apache.commons.httpclient.HttpClient) hoạt động với NTLM và tôi cần sử dụng các dịch vụ web SAME khi giao dịch với các máy chủ chia sẻ bằng cách sử dụng các kerberos. –

+0

Phần nào của bài viết tôi đã đề cập sẽ là một vấn đề, trong đó bạn cần lấy vé và tôi không chắc chắn cách bạn lên kế hoạch thực hiện điều đó. Nó có thể giúp đỡ nếu bạn đi vào chi tiết hơn. –

Trả lời

3

Vui lòng xác nhận rằng môi trường của bạn là chính xác thiết lập cho Kerberos, điều này có thể đạt được bằng cách chạy kinit. Nếu điều này không thành công, bạn sẽ cần phải đảm bảo rằng krb5.ini (windows) hoặc krb5.conf (linux) của bạn được thiết lập để trỏ đến bộ điều khiển miền của bạn một cách chính xác.

Khi bạn đã xác nhận rằng Kerberos có chức năng, bạn có thể sử dụng mã mẫu từ HttpClient như được dán dưới đây. Xin lưu ý rằng có nhiều vấn đề có thể khiến Kerberos thất bại, chẳng hạn như đồng bộ hóa thời gian, các kiểu mã hóa được hỗ trợ, mối quan hệ tin cậy giữa các khu rừng miền và nó cũng đảm bảo rằng khách hàng của bạn đang ở trên một hộp riêng biệt với máy chủ.

Dưới đây là mã ví dụ có sẵn trong phần tải xuống HttpClient, bạn sẽ cần phải đảm bảo cấu hình JAAS và krb5.conf hoặc ini của bạn là chính xác!

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

i không có keytab và krb5.conf, tôi có cần định nghĩa chúng không? đây là url kerberos sharepoint tôi đang cố gắng truy cập: https://sp10-krb.qa.eng.mycompany.com/sites/mysite/myrestservice.aspx sẽ kiểm tra kinit là: kinit [email protected] COM mysppassword? –

+0

'krb5.conf' và' login.config' là bắt buộc.Sau đó, nếu khách hàng của bạn luôn sử dụng cùng một danh tính người dùng để kết nối, một keytab có thể là một ý tưởng tốt để tránh xác thực người dùng/mật khẩu với sự cố để lưu trữ mật khẩu ở đâu đó. –

+0

Tôi cung cấp tên và mật khẩu chính xác ở đâu nếu tôi không sử dụng keytab? –

Các vấn đề liên quan