2013-02-05 54 views
5

我嘗試編寫訪問Exchange Web服務以讀取電子郵件的Java應用程序。因此,我使用由Microsoft提供的Exchange Web服務(EWS)Java API。如何在Java中使用LDAP身份驗證進行Exchange Web服務連接?

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

我們解決了這個問題。實際上,我們有兩種解決方案:

在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建議的)的工作原理,但它在其他方面正在打破。

然而,有EWS Java庫,hostet在GitHub的一個新版本: https://github.com/OfficeDev/ews-java-api

現在使用Apache的HttpClient 4.4.1,它具有良好的NTLM的實現。

使用此庫,迄今爲止我們沒有關於NTLM身份驗證的更多問題。

相關問題