上一篇文章提到了我在开发显示Exchange未读邮件数的WebPart中遇到了身份凭据传递的问题。因为Exchange的WebDAV是根据不同的用户返回不同邮箱的数据,当然就是非匿名的。输入身份信息一种方法是在网页上放置一个输入用户名和密码的Form,这样构建的NetworkCredential不存在传递的问题。但是,由于我的网络是基于Windows域方式的,每个用户要登录到域中,因此使用Windows集成身份验证能够让用户在SharePoint中使用当前的身份凭据登录,这样比输入用户名密码更加方便和友好。也就是说,为了免去用户再次输入Exchange用户名和密码,需要把客户端当前登录的Credential(用户身份凭据)传递到Exchange服务器上。然而,我的Exchange服务器和SharePoint网站服务器是两台不同的服务器,如果要使用集成身份验证并使用Windows和SharePoint默认的NTLM身份验证协议是无法将当前HttpContext中的身份凭据从Web服务器传递到Exchange服务器上的。而且也不可能从当前的身份凭据中获得用户名和密码,所以也不可能自己构建一个可传递的NetworkCredential。这就是著名的“Double Hop”双跳问题。
当然解决这个问题有很多方法,比如可以用到SharePoint的单点登录Single-Sign-On(SSO)。但是每个用户需要在第一次使用之前先输入一次自己的Exchange密码储存到SSO数据库中,而且如果更改了Exchange密码需要再同时修改SSO数据,也比较麻烦。所以最好的解决方案就是使用Kerberos身份验证协议代替NTLM身份验证协议。
NTLM身份验证协议之所以无法传递身份凭据是由该协议本身的限制决定的,下图解释了原因。

其实说“身份凭据传递”是不太恰当的,实际上是让Web服务器账户模拟客户端的用户来再对Exchange服务器发送请求。从上图中我们可以看到NTLM协议无法让Web服务器模拟客户端,因此Exchange收到的是一个未知用户的请求,所以会返回401身份验证错误。
在这种情况下只能使用Kerberos协议,因为该协议最重要的特性之一就是可以委派。也就是说Web服务器可以模拟客户端对Exchange服务器发送请求。如下图所示。
另外,为了增加安全性,Windows Server 2003中还为Kerberos增加了约束委派特性。可以指定委派的服务,那么没有指定的服务将无法使用委派。如下图所示。
那么,如何启用Kerberos身份验证代替NTLM呢?步骤如下:
一、以SharePoint为例,首先要修改IIS的配置文件以启用Kerberos验证。
如果安装了SPS SP2以后则可以不用手动修改IIS配置文件,在SPS创建网站的时候就会有身份验证协议的选项。
二、为Web服务运行的帐号配置服务主体名称(SPN)
一般SPS的服务都是以一个域用户身份运行的,那么应该为该用户设置SPN。
三、为Web服务器运行的帐号配置委派信任关系
该步骤一定要设置为约束委派,我之前一直试验用非约束委派结果一直失败。
为SPS启用Kerberos身份验证的具体方法和说明可参考http://support.microsoft.com/default.aspx?scid=kb;zh-CN;832769
以上为我的案例中的步骤,不同情况配置情况不尽相同。在配置Kerberos委派的过程中有几个关键点。
1、IIS要设置为Windows集成验证
2、一定要确定客户端使用的是Kerberos身份验证协议,这个可以通过抓包软件或者Kerberos Tray来监视。注:Kerberos使用88端口。
3、如果Web服务是基于本地系统或者网络服务的则无需设置SPN,否则一定要为域用户设置SPN。
4、如果Web服务是基于本地系统或者网络服务的则要在Active Directory中为该Web服务的这台计算机设置委派信任关系,否则要为Web服务所基于的域用户设置委派信任关系,而且一定要设置成为约束委派!
5、Web.config中要有<authentication mode="Windows" />和<identity impersonate="true" />
更详细的信息、设置方法和故障排除方法可以参考http://www.microsoft.com/china/technet/prodtechnol/windowsserver2003/technologies/security/tkerbdel.mspx 。这篇文章虽然有点长不过可谓字字珠玑,我就是在认真研读后才最终解决我的问题的。






[...] 本文转自:http://www.felixwoo.com/archives/146 [...]