1

我已经阅读了许多博客,以及许多关于如何让我的 IIS 服务器将经过身份验证的用户传递给 SQL 的文章。然而,我被困在我究竟需要什么来设置我的 SPN 上。这是我的设置...

IIS:
应用程序池 .Net v4.0
集成管道
标识 = NetworkService

身份验证:
ASP.NET Impersonation = True(已启用)
Windows 身份验证已启用
Provider = Negotiate:Kerberos
Disabled 内核模式身份验证

IIS SERVER:
信任任何服务的委派(仅限 kerberos)

SQL SERVER:
信任任何服务的委派(仅限 kerberos)

根据我对这些设置的理解,我应该将我当前登录的 Windows 帐户传递到 IIS 服务器,它应该将该令牌传递给 SQL 以进行身份​​验证我。但是,它只是不断地提示我输入站点的用户/通行证。

我发现这篇文章http://blog.reveille.org.uk/2010/01/asp-net-impersonation-delegation-2/告诉我我需要在“机器”上使用类似这样的设置 SPN:

setspn -A HTTP/[dns name of the site] [machine name]

我不确定我需要什么 SPN。谁能帮帮我?我在想它就像

setspn -A HTTP/mywebserver.mydomain.com mywebserver

或者在我的应用程序池中使用域帐户并设置 SPN 会更好吗?

4

1 回答 1

2

好的 ol' Kerberos。除非要求更多解释,否则我不会使这个答案过于复杂。我将根据您的问题假设我们正在谈论单个服务器,并且我还将假设它已加入域。因此,我将为我的清单定义以下内容:

  • 让服务器的 NetBIOS 名称为websvr1
  • 让服务器的 FQDN(完全限定域名)为websvr1.domain.com
  • 当然,我们假设我们在域domain.com上
  • 让 SQL Server 的 NetBIOS 名称为sql1
  • 让 SQL 服务器的 FQDN 为sql1.domain.com
  • 让 SQL Server 服务用户为DOMAIN\sqlusr
  • 我假设默认 SQL Server 端口为 1433

话虽如此,加上考虑到您的问题中已经说明的内容,我会尝试这种设置:

第一跳设置 (SPN)

  • 注册以下 SPN
  • setspn -S HTTP/websvr1.domain.com websvr1$
  • setspn -S HTTP/websvr1 websvr1$

第一跳设置(身份验证)

  • 请在提供程序中包含 Negotiate 和 NTLM 以允许回退机制。
  • 注意:确保协商位于提供商列表中的 NTLM之上
  • 您不需要禁用内核模式身份验证。老实说,我不确定为什么这么多人禁用内核模式身份验证。即使对于作为域帐户运行的应用程序池,您也可以使用 useAppPoolCredentials="true" 属性来允许内核模式身份验证成功解密使用域帐户加密的 Kerberos 票证。
  • 您的其余设置都很好。

第二跳设置 (SPN)

  • 为了确保我们涵盖所有可能的组合,请设置以下 SPN:
  • setspn -S MSSQLSvc/sql1.domain.com 域\sqlusr
  • setspn -S MSSQLSvc/sql1.domain.com:1433 DOMAIN\sqlusr
  • setspn -S MSSQLSvc/sql1 域\sqlusr
  • setspn -S MSSQLSvc/sql1:1433 域\sqlusr

第二跳设置(IIS 委派)

现在 IIS 和 SQL SPN 都已设置,您应该能够设置约束委派以允许 IIS 代表当前登录的用户请求 MSSQLSvc 服务票证。

  • 在 DOMAIN\websvr1 计算机帐户的 AD 委派选项卡中,选择“信任此计算机仅委派到指定的服务”选项。
  • 保留仅使用 Kerberos
  • 从列表中选择 MSSQLSvc\sql1 和 MSSQLSvc\sql1.domain.com 并添加这些服务。

上面的设置被认为是受约束的 Kerberos 委派,它比不受约束的委派安全得多。据我了解,这应该涵盖它。

笔记

我选择使用 setspn -S 因为它可以确保我不会意外设置重复的 SPN 并破坏 Kerberos 身份验证。在上面的示例中,请将服务器名称、FQDN 和帐户替换为它们各自的真​​实值。

注意(再次)

对于 Web 服务器 SPN,如果出于某种原因我们请求的 URL 主机只是一个自定义 DNS 条目(顺便说一下,请确保它是 A 记录而不是 CNAME),那么您需要注册所述 DNS 条目反而)。

希望以上信息对您有所帮助。

于 2016-03-17T05:57:50.163 回答