2013-02-05 13 views
5

Próbuję napisać aplikację Java, która uzyskuje dostęp do Exchange Web Services w celu czytania wiadomości e-mail. W związku z tym korzystam z udostępnianego przez Microsoft API Java Web Services (EWS).Jak korzystać z uwierzytelniania LDAP dla połączenia z usługami Exchange Web Services w Javie?

I already had several issues with it, a w końcu stwierdziłem, że uwierzytelnianie powinno być wykonywane przy użyciu protokołu LDAP. Niestety, nie jestem pewien jak to zrobić. Czy interfejs API EWS pozwala skonfigurować schemat uwierzytelniania, który ma być używany podczas łączenia się z serwerem Exchange? Jeśli tak, jak to skonfigurować?

Jest to kod używam do podłączenia, ale korzysta z domyślnego schematu uwierzytelniania, tj NTLM:

String url = "https//my-server/EWS/exchange.asmx"; 
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1); 
service.setTraceEnabled(true); 
service.setCredentials(new WebCredentials("user", "password")); 
service.setUrl(url.toURI()); 

Mailbox mailbox = new Mailbox("[email protected]"); 
FolderId folder = new FolderId(WellKnownFolderName.Inbox, mailbox); 
ItemView view = new ItemView(10); 
view.getOrderBy().add(ItemSchema.DateTimeReceived, SortDirection.Descending); 
FindItemsResults<Item> items = service.findItems(folder, view); 

Odpowiedz

2

Rozwiązaliśmy ten problem. W rzeczywistości mieliśmy dwa rozwiązania:

W interfejsie Microsft EWS API klasa NTLM była nieprawidłowa. Więc Przebudowany JAR z następującego kodu dla klasy:

private class NTLM { 
    /** Character encoding */ 
    public static final String DEFAULT_CHARSET = "ASCII"; 

    /** 
    * The character was used by 3.x's NTLM to encode the username and 
    * password. Apparently, this is not needed in when passing username, 
    * password from NTCredentials to the JCIFS library 
    */ 
    private String credentialCharset = DEFAULT_CHARSET; 

    void setCredentialCharset(String credentialCharset) { 
      this.credentialCharset = credentialCharset; 
    } 

    private static final int TYPE_1_FLAGS = NtlmFlags.NTLMSSP_NEGOTIATE_NTLM 
       | NtlmFlags.NTLMSSP_NEGOTIATE_UNICODE 
       | NtlmFlags.NTLMSSP_NEGOTIATE_NTLM2; 

    private String generateType1Msg(String host, String domain) { 
      jcifs.ntlmssp.Type1Message t1m = new jcifs.ntlmssp.Type1Message(
         TYPE_1_FLAGS, domain, host); 
      return jcifs.util.Base64.encode(t1m.toByteArray()); 
    } 

    private String generateType3Msg(String username, String password, 
       String host, String domain, String challenge) { 
      jcifs.ntlmssp.Type2Message t2m; 
      try { 
       t2m = new jcifs.ntlmssp.Type2Message(
           jcifs.util.Base64.decode(challenge)); 
      } catch (IOException e) { 
       throw new RuntimeException("Invalid Type2 message", e); 
      } 

      final int type2Flags = t2m.getFlags(); 
      final int type3Flags = type2Flags 
         & (0xffffffff^(NtlmFlags.NTLMSSP_TARGET_TYPE_DOMAIN | NtlmFlags.NTLMSSP_TARGET_TYPE_SERVER)); 

      jcifs.ntlmssp.Type3Message t3m = new jcifs.ntlmssp.Type3Message(
         t2m, password, domain, username, host, type3Flags); 
      return jcifs.util.Base64.encode(t3m.toByteArray()); 
    } 
} 

Innym rozwiązaniem jest użycie JWebServices biblioteki (handlowych).

+0

Postępowałem zgodnie z tymi wskazówkami i zmodyfikowałem NTLM i skompilowałem ze źródła dokładnie tak, jak to opisano tutaj i nadal otrzymywałem te same komunikaty o błędach. Postanowiliśmy zastosować tutaj implementację javamail, która działała: http://stackoverflow.com/a/18043717/445131 –

+0

ta klasa jest wewnętrzną klasą w EwsJCIFSNTLMScheme (api 1.2) – oers

0

Mieliśmy ten sam problem i mimo że zmiana klasy NTLM (zgodnie z sugestią romaintaz) działała, to w pewnym momencie uległa ona uszkodzeniu.

Jednak istnieje nowsza wersja biblioteki EWS Java, hostet na github: https://github.com/OfficeDev/ews-java-api

Teraz używa apache httpclient 4.4.1, który ma dobrą NTLM-realizacji.

Korzystając z tej biblioteki, nie mieliśmy dotychczas żadnych problemów związanych z uwierzytelnianiem NTLM.

Powiązane problemy