我公司的 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