2013-02-05 1 views
5

전자 메일을 읽기 위해 Exchange 웹 서비스에 액세스하는 Java 응용 프로그램을 작성하려고합니다. 따라서 Microsoft에서 제공하는 Exchange 웹 서비스 (EWS) Java API를 사용합니다.Java에서 Exchange 웹 서비스 연결에 LDAP 인증을 사용하는 방법?

I already had several issues with it 그리고 마지막으로 LDAP를 사용하여 인증을 수행해야한다는 사실을 알게되었습니다. 불행히도, 나는 그런 일을하는 방법을 잘 모르겠습니다. EWS API는 Exchange 서버에 연결할 때 사용할 인증 체계를 구성 할 수 있습니까? 그렇다면 구성 방법은 무엇입니까?

내가 연결을 위해 사용하는 코드이지만, 기본 인증 방식, 즉 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); 

답변

2

우리는이 문제를 해결합니다. 사실, 우리는 그것을위한 2 가지 솔루션을 가지고 있습니다 :

Microsft EWS API에서 클래스 NTLM은 잘못되었습니다. 그래서 우리는 클래스의 다음 코드로 JAR을 구축 재 :

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()); 
    } 
} 

또 다른 해결책은 JWebServices 라이브러리 (상업)를 사용하는 것입니다.

+0

이 지침을 따르고 NTLM을 수정하고 여기에서 설명한대로 원본에서 컴파일하고 동일한 오류 메시지를 받았습니다. 우리는 여기서 작동하는 javamail 구현을 사용하여 해결했습니다. http://stackoverflow.com/a/18043717/445131 –

+0

이 클래스는 EwsJCIFSNTLMScheme (api 1.2)의 내부 클래스입니다. – oers

0

우리는 같은 문제가 있었지만 NTLM 클래스를 변경하더라도 (romaintaz가 제안한 것처럼) 작동했지만 다른 시점에서는 깨졌습니다. 그것은 지금 좋은 NTLM - 구현이 아파치 HttpClient를 4.4.1을 사용 https://github.com/OfficeDev/ews-java-api

:

그러나, GitHub의에서 EWS 자바 라이브러리, hostet의 새로운 버전이 있습니다.

이 라이브러리를 사용하여 지금까지 NTLM 인증과 관련하여 더 이상 문제가 없었습니다.