在将凭据从用户传递到 IIS,再从 IIS 传递到 SQL 时,我无法让 Windows 身份验证 (Kerberos) 正常工作。我已为 SQL 设置了 SPN,并设置了 IIS 服务器帐户以允许委派。
如果我将 IIS 计算机帐户设置为允许任何服务的委派,则它可以工作:
但是,如果我为特定服务进行设置,则凭据不会传递,并且我会收到有关与匿名用户连接的错误:
如您所见,我正在连接到 SQL Express 实例,并且我设置了许多 SPN 来尝试解决此问题,但都没有成功。显然,它在允许任何服务时都能正常工作,这说明这个服务列表中还缺少其他东西,但我不知道是什么!
答案1
对于可能遇到此问题的其他任何人来说,问题在于使用内核模式身份验证,并使用域用户帐户作为应用程序池帐户。
内核模式身份验证为您完成了有关 IIS SPN 的大部分工作,但它要求您使用系统帐户作为应用程序池标识。如果您使用的是域帐户,则需要为该用户设置 HTTP SPN。然后,您需要在该用户帐户上委派对 SQL 的访问权限,而不是在 IIS 计算机帐户上委派访问权限,就像您通常使用内核模式身份验证一样。
答案2
我过去曾在 IIS6 和 Windows 2003 以及 SQL 2005 上运行过这个程序,但是我已经很久没有看过它了,但如果它有帮助的话,以下是我可以找到的内容:
在 AD 中,Web 服务器有一个 SQL 服务器条目,设置为“仅信任指定服务”、“使用任何身份验证协议”,并且该条目具有 SQL 主机名,而不是 FQDN。服务类型为 MSSQLSvc,端口为 1433。
SQL Server 计算机帐户不受信任,不能进行委派。
我还记得在配置它时必须在命令行上使用“setspn”,并且我从“setspn -L webserver”获得的设置是:
HTTP/intranet.domain.example.org:80
HTTP/intranet:80
HOST/webserverhostname
HOST/webserverhostname.domain.example.org
其中,“intranet”是我们用于网站的别名,请输入您的真实 FQDN,而不是 example.org 的 FQDN,例如
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
答案3
我发现无论 Web 服务器 SPN 配置如何,我都需要使用 SQL Server 名称的 HOST 记录(而不是 CNAME 别名)为 SQL Server 创建 SPN。
也就是说,为了涵盖所有基础,我添加了如下 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/sqlserver主机名 SQLServer服务帐户名
..确保“sqlserverhostname”在DNS上注册为HOST记录。