如何在Java中使用LDAP身份验证进行Exchange Web服务连接?
发布时间:2020-05-24 01:38:20 所属栏目:Java 来源:互联网
导读:我尝试编写一个访问Exchange Web服务的 Java应用程序,以便阅读电子邮件.因此,我使用Microsoft提供的Exchange Web服务(EWS)Java API. I already had several issues with it,我终于发现应该使用LDAP完成身份验证.不幸的是,我不知道怎么做这样的事情. EWS API是
|
我尝试编写一个访问Exchange Web服务的 Java应用程序,以便阅读电子邮件.因此,我使用Microsoft提供的Exchange Web服务(EWS)Java API. 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("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,username,host,type3Flags);
return jcifs.util.Base64.encode(t3m.toByteArray());
}
}
另一种解决方案是使用JWebServices库(商业). (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读
