0

我正在尝试使用 ASP.NET 4.5/SQL Server 2016 为 Web 应用程序设置模拟/委托。目标是在 Web 应用程序和 SQL Server 上使用 Windows 身份验证。

我在 Azure 上复制了一个类似于将用于生产的设置,但我似乎无法找到导致模拟不起作用的原因。

Azure VM #1 [机器名称:test-iis-server]:运行 IIS 8.5 并充当 Active Directory 域控制器的 Windows Server 2012

Azure VM #2 [机器名称:test-sql-server]:运行 SQL Server 2016 的 Windows Server 2016

Azure VM #3 [机器名称:test-client]:用于模拟用户连接到网站的 Windows 10 机器

我创建了一个名为TEST. 可以使用在 Active Directory 中创建的用户连接到 3 台计算机。

IIS Web 服务器配置:

  • 在 web.config 文件中:

    • Authentication mode = Windows
    • Identity impersonate = True
    • validation validateIntegratedModeConfiguration = False
    • Integrated security = SSPI
  • 在 IIS 管理器中:

    • Windows authentication = Enabled( Kernel-mode authentication = Disabled, Providers = Negotiate:Kerberos)
    • ASP.NET Impersonation = Enabled
    • 应用程序池 = Integrated Managed Pipeline( Identity = Custom Identity: test\my-svc-account)
  • Active Directory Users & Computers

    • 对于每台计算机(Web 服务器、sql 服务器和用户计算机),我进入 Properties 并检查了Delegation选项卡Trust this computer for delegation to any service (Kerberos only)

SQL 服务器配置

  • 我没有在这里设置任何东西。我假设 ASP.NET 将使用登录 Web 应用程序的用户的凭据来访问 SQL Server 数据库。
  • 编辑:SQL Server 服务帐户:test\my-svc-account

结果:

  • 如果我不在 Web 应用程序中使用模拟并使用在 SQL Server 中创建的已定义用户/密码登录,我的应用程序可以正常工作,并且如果需要,我可以获得 Windows 用户凭据。

  • 使用模拟,打开 Web 应用程序页面时出现 SQL Server 连接错误:Login failed for user 'TEST\test-iis-server$'.

预期行为:

  • Web 应用程序将使用用于登录“测试客户端”机器的凭据登录 SQL Server。

我已经阅读了很多关于如何为我的解决方案实施模拟/委托的内容,但似乎无法找到问题所在。任何人都知道问题可能来自哪里以及我如何解决它?

编辑#1:

  • 根据我的阅读,我似乎需要设置 SPN。我对如何为我的双跳场景正确设置它们感到困惑。
  • 我在 Active Directory 中创建了一个用户帐户来充当服务帐户。我已将此帐户设置为受信任以进行委派。
  • 我将此帐户用作 IIS 中我的应用程序池的标识以及 SQL Server 实例的服务帐户。
4

1 回答 1

1

是的,您确实需要为 ASP.NET 应用程序池标识和 SQL Server 服务帐户配置 SPN。

它相对简单,但您需要确保获得正确的值。

在 AD 用户和计算机中找到“my-svc-account”帐户并打开属性。导航到属性编辑器选项卡(如果您没有看到它,请通过 ADUC 的“查看”菜单启用高级功能)。找到 servicePrincipalName 属性并对其进行编辑。添加以下内容:

http/servicename.foo.com

http/servername<== 可选

与您的DNSservice.foo.com名称匹配的位置。如果这是 CNAME,您还需要包括基础 A 记录名称。因此,如果servicename.foo.com映射到whatever.cloudapp.net,则需要为 . 添加 SPN whatever.cloudapp.net。这是针对 IE 的,因为 IE 是......愚蠢......并且试图变得聪明(它将 DNS 解析为最低的命名记录并为此请求一个 SPN)。

然后对 SQL Server 服务帐户执行相同的操作。

MSSQLSvc/sqlserver.foo.com

MSSQLSvc/sqlserver<== 可选

这需要是 SQL Server 主机的 FQDN。

最后,您需要在应用程序池标识和 SQL Server 服务帐户之间启用约束委派。这是委派控件中的第三个单选按钮。将 SQL Server SPN 添加为委派目标。

重新启动 IIS 和 SQL。尝试浏览到应用程序。您现在应该看到它以您的指定用户身份连接到 SQL。

于 2018-04-03T17:48:02.423 回答