[英]How to use LDAP authentication for the Exchange Web Services connection in Java?
我嘗試編寫一個訪問Exchange Web服務的Java應用程序,以便閱讀電子郵件。 因此,我使用Microsoft提供的Exchange Web服務( EWS
)Java API。
我已經遇到了幾個問題 ,我終於發現應該使用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("foo@bar.com");
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);
我們解決了這個問題。 事實上,我們有兩個解決方案:
在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庫(商業)。
我們遇到了同樣的問題,雖然改變了NTLM類(如romaintaz建議的那樣),但它在其他方面有所突破。
但是,有一個更新版本的EWS Java庫,github上的hostet: https : //github.com/OfficeDev/ews-java-api
它現在使用apache httpclient 4.4.1,它具有良好的NTLM實現。
使用此庫,到目前為止我們沒有關於NTLM身份驗證的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.