2013-02-05 56 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身份验证的更多问题。

相关问题