2013-02-05 3 views
5

Ich versuche eine Java-Anwendung zu schreiben, die auf einen Exchange-Webservice zugreift, um E-Mails zu lesen. Daher verwende ich die Java-API für Exchange-Webdienste (EWS), die von Microsoft bereitgestellt wird.Wie wird die LDAP-Authentifizierung für die Exchange-Webdienste-Verbindung in Java verwendet?

I already had several issues with it, und ich fand schließlich, dass die Authentifizierung mit LDAP erfolgen sollte. Leider bin ich mir nicht sicher, wie ich so etwas machen soll. Ermöglicht die EWS-API die Konfiguration des Authentifizierungsschemas für die Verbindung mit dem Exchange-Server? Wenn ja, wie konfiguriert man das?

Dies ist der Code, den ich für die Verbindung verwenden, aber es nutzt das Standard-Authentifizierungsschema, das heißt 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); 

Antwort

2

Wir haben dieses Problem behoben. Tatsächlich hatten wir 2 Lösungen dafür:

In der Microsft EWS API war die Klasse NTLM falsch. Also haben wir die JAR mit dem folgenden Code für die Klasse neu gebaut:

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

Eine andere Lösung zu verwenden ist, um die JWebServices Bibliothek (kommerziell).

+0

Ich folgte diesen Anweisungen und modifizierte NTLM und kompilierte von Quelle genau wie hier beschrieben und immer noch die gleichen Fehlermeldungen erhalten. Wir entschieden uns für die Javamail-Implementierung, die hier funktionierte: http://StackOverflow.com/a/18043717/445131 –

+0

Diese Klasse ist eine innere Klasse in EwsJCIFSNTLMScheme (api 1.2) – oers

0

Wir hatten das gleiche Problem und obwohl das Ändern der NTLM-Klasse (wie romaintaz vorgeschlagen) funktioniert, brach es an einem anderen Punkt.

Allerdings gibt es eine neuere Version der EWS-Java-Bibliothek, Gehostet bei Github: https://github.com/OfficeDev/ews-java-api

Es ist nun Apache Httpclient verwendet 4.4.1, die eine gute NTLM-Implementierung hat.

Mit dieser Bibliothek hatten wir bisher keine Probleme mehr bezüglich der NTLM-Authentifizierung.

Verwandte Themen