在 Intranet 环境中对远程服务器进行 Windows 身份验证

在 Intranet 环境中对远程服务器进行 Windows 身份验证

我公司的 Intranet 环境中有几台服务器(全部位于同一 DC 上)。为简单起见,我将问题集中在 IIS 和 SQL Server 上。我在域中的另一台计算机上有一台 IIS 7.5 Web 服务器和一台远程 SQL Server 2005。

以下是我希望实现的要求:

  • IIS 服务器上的 Web 应用程序应该使用某种形式的身份验证(大概是 Windows 身份验证),这样用户就不需要进行身份验证,因为它将使用他们登录 Windows 计算机时的网络用户凭据。
  • 理想情况下,身份验证方法也应通过网络 VPN 连接得到支持。
  • 应将用户身份(主体)传递到远程 SQL Server,以便该服务器上的查询能够识别用户,从而支持基于其用户名的授权。例如,查询select suser_sname()应返回通过 IIS Web 应用程序对 DB 执行操作的人员的实际用户名。
  • 该解决方案至少应适用于网络上的 SQL Server 和 UNC 路径。
  • 高度可靠且面向未来(即最佳实践)。

过去几年里,我花了至少几周时间(累计)研究这个问题,但一直无果。请先帮我了解一下是否有可能满足这些要求(我相当确定是可以的),然后告诉我“如何”实现这一点,以及我应该考虑上述解决方案的哪些限制。

我目前所做的:

  • 我有一个测试应用程序,它报告 Kerberos 为AuthenticationType使用 Windows Auth 专门启用。
  • Windows Auth 配置为使用“协商”作为提供程序,并且还需要启用内核模式的扩展保护。
  • 应用程序池在集成模式下使用.NET 4.0。
  • 应用程序池标识是一个自定义域帐户,我们将其注册为 SPN。
  • IIS 服务器在 AD 中启用了委派,但 SQL Server 没有。

我所能做的最好的事情就是确认 Kerberos http 标头的存在,但我的测试应用程序显示应用程序池的自定义用户(SPN 帐户)正在传递,而不是我自己的。如果您愿意,以下是我的测试应用程序的结果:

Result             Field Description              Test App Code
------             -----------------              -------------
Negotiate          Page Authentication Type       Page.User.Identity.AuthenticationType
<dc>\<username>    Page Identity                  Page.User.Identity.Name
Kerberos           Principal Windows Auth Type    WindowsIdentity.GetCurrent().AuthenticationType
<dc>\<spnUser>     Principal Windows Identity     WindowsIdentity.GetCurrent().Name
<dc>\<username>    HttpContext User               HttpContext.Current.User.Identity.Name
<dc>\<username>    Server Var "LOGON_USER"        Request.ServerVariables("LOGON_USER")
<dc>\<username>    Thread Current Principal       Threading.Thread.CurrentPrincipal.Identity.Name

相关内容