当从用户传递凭据到IIS然后从IIS传递到SQL时,我遇到了使Windows身份validation(Kerberos)起作用的问题。 我已经为SQL设置了SPN,并设置了IIS服务器帐户以允许委派。
如果我将IIS计算机帐户设置为允许任何服务的委派,它将起作用: 
但是,如果我为特定的服务设置它,凭证不会传递,并且出现与匿名用户连接的错误:

正如您所看到的,我正在连接到SQL Express实例,并且已经设置了一些SPN来尝试解决这个问题,没有任何一个运气好。 很明显,它允许任何服务的时候,它的工作事实,对我说,这个服务列表中还有其他东西丢失,但我不知道是什么!
对于任何可能遇到此问题的人,问题归结为使用内核模式身份validation,与应用程序池帐户的域用户帐户。
内核模式身份validation为您执行有关IIS SPN的大部分工作,但是它期望您使用系统帐户来获取应用程序池身份。 如果您使用的是域帐户,则需要为该用户设置HTTP SPN。 然后,您将需要在此用户帐户上委派对SQL的访问权限,而不是像在“内核模式”身份validation中那样,在IIS计算机帐户上进行委派。
过去我使用IIS6和Windows 2003以及SQL 2005都有这样的工作,但是我看了很长一段时间,但是如果有帮助的话,我可以find:
在AD中,Web服务器有一个条目,用于将SQL服务器设置为“仅信任指定的服务”,“使用任何身份validation协议”,条目具有SQL主机名,而不是FQDN。 服务types是MSSQLSvc,端口是1433。
SQL Server计算机帐户不受信任委派。
我还记得在configuration时必须在命令行中使用“setspn”,而我从“setspn -L webserver”所具有的设置是:
HTTP/intranet.domain.example.org:80 HTTP/intranet:80 HOST/webserverhostname HOST/webserverhostname.domain.example.org
如果“intranet”是我们用于网站的别名,并且放入了真正的FQDN,而不是example.org,
setspn -A HTTP/intranet:80 webserver
等等。
此外,这看起来像一个非常彻底的清单: http : //blogs.technet.com/b/taraj/archive/2009/01/29/checklist-for-double-hop-issues-iis-and-sql-server。 ASPX
我发现,无论Web服务器SPNconfiguration如何,我都需要使用SQL Server名称的HOSTlogging而不是CNAME别名为SQL Server创buildSPN。
也就是说,为了覆盖所有的基础,我增加了以下SPN:
setspn -A MSSQLSvc / sqlserverhostname.example.org SQLServerServiceAccountName
setspn -A MSSQLSvc / sqlserverhostname:1433 SQLServerServiceAccountName
setspn -A MSSQLSvc / sqlserverhostname.example.org:1433 SQLServerServiceAccountName
setspn -A MSSQLSvc / sqlserverhostname SQLServerServiceAccountName
..确保“sqlserverhostname”在DNS上注册为HOSTlogging。