2010-07-21 33 views
2

我一直在使用SPNEGO为基于Java的Web应用程序提供Single Sign On的项目。目前,它正在Jetty + SPNEGO和Active Directory上成功运行,所以如果您访问我的测试页面,它可以输出auth_user以及Negotiate令牌,前提是浏览器已正确配置。使用Java + Exchange 2007进行单点登录EWS

该项目的下一步是能够通过用户和令牌到Exchange Web服务作为身份验证,所以我可以访问远程用户交换目录(邮件,联系人等)

我已经运行JAX-WS以从Services.wsdl文件生成存根文件,并能够使用这些类连接到Exchange。唯一的问题是,它只会验证运行Web服务器的用户,而不是远程用户。

我也注意到我无法找到正确的类来传递令牌,而不是用户名和密码到EWS。另外,生成的文件没有任何对SPNEGO的引用。

有谁知道可能的解决方案,还是看起来像我将不得不手动生成SOAP调用,而不是使用生成的类?

感谢您的时间

回答

0

我们已经设法使用Apache HTTP Client 4.1 alpha/Samba JCIFS库和生成SOAP请求来启动并运行解决方案。这使我们可以让多个用户登录,而无需对他们的交换账户进行任何配置。

我们确实使用HttpClient 3.1,但由于使用较新版本的Windows更改NTLM协议而遇到问题,因此我们升级到最新版本。

+0

那么,你正在使用这里描述的方法? http://hc.apache.org/httpcomponents-client-4.0.1/ntlm.html你如何指定每个用户的电话密码? – Soundlink 2010-08-30 19:39:46

1

我认为,最好的办法,以对EWS认证是使用正在运行Web服务器的用户。这是Exchange Web服务的“服务帐户”。此帐户需要“Exchange Web服务模拟”权限(ms-Exch-EPI-Impersonation)。

如果您想访问远程用户交换数据,您必须在呼叫中使用“交换模拟”。对于单个交换服务器用户(“帐户”),您必须通过设置“允许模拟个人交换信息”(ms-Exch-EPI-May-Impersonate)权限来允许他可以模拟他们的服务帐户。

因此,每个呼叫都使用相同的服务帐户进行身份验证,但您在通话中使用交换模拟作为特定用户/邮箱。

您的web应用程序中的单点登录用于确定当前用于交易模拟的“作为帐户”。你需要用户的电子邮件地址或SID。

+0

当前,我不得不使用wsdl编程式地生成实际的SOAP请求_without_。 由于使用java.net.Authenticator来保存凭证,因此我们遇到了不同用户正在登录的问题。 我会说整个wsdl/axis或jax-ws方法由于这个而有缺陷。 我曾尝试重新使用SPNEGO令牌,但因为我没有生成它,它总是失败。 – Paul 2010-08-10 08:08:05

+0

Authenticator只在第一次调用时初始化,所以这应该是Web服务器的用户,您的EWS服务帐户。我不认为有可能在这里使用每个远程用户。然后您应该使用Exchange模拟来进行呼叫。如果您使用wsdl创建代理类或以编程方式生成SOAP请求,我认为这种机制是相同的。 – Soundlink 2010-08-10 11:28:30