2013-02-05 26 views
5

メールを読むためにExchange Web ServicesにアクセスするJavaアプリケーションを作成しようとしています。したがって、マイクロソフトが提供するExchange Web Services(EWS)Java APIを使用します。JavaでExchange Web Services接続に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-実装を持っているApacheのHTTPClientの4.4.1を使用しています https://github.com/OfficeDev/ews-java-api

しかし、githubのでEWS Javaライブラリ、hostetの新しいバージョンがあります。

このライブラリを使用することで、今までNTLM認証に関する問題はなくなりました。

関連する問題