我有一个 ASP.NET 4.0 应用程序,我需要在其中将身份验证转发到数据库。出于此请求帮助的目的,我们将 Web 服务器称为“app1”,将数据库服务器称为“sql1”。
SQL2008R2 数据库服务在自定义域帐户“SqlServer”下作为命名实例“SQL2008R2”运行。服务器正在运行 Windows Server 2008 R2 企业版。我为此创建了一个 SPN...
setspn -a MSSQLSvc/sql1.mydomain.local:SQL2008R2 SqlServer
ASP.NET 应用程序在集成管道模式下使用自定义域帐户“WebApplicationUser”在应用程序池下运行。它目前在我运行 Windows 7 Enterprise 的笔记本电脑上运行,但最终将托管在 Windows Server 2008 R2 标准版上。我为应用程序创建了 2 个 SPN(在我当前运行的 Windows 7 机器上)...
setspn -a http/app1 WebApplicationUser
setspn -a http/app1.mydomain.local WebApplicationUser
在 Active Directory 用户和计算机中,我选择了“WebApplicationUser”帐户,并使用任何协议启用了对“MSSQLSvc/sql1.mydomain.local:SQL2008R2”的约束委派(我也尝试过仅使用 Kerbero)。
该应用程序在 IIS 7.5 中设置,身份验证设置为禁用 Anonymouse、Basic、Digest 和 Forms,同时启用“ASP.NET Impersonation”和“Windows”。Windows 身份验证关闭了“扩展保护”并启用了“内核模式身份验证”。提供者按顺序是“协商”和“NTLM”。
ASP.NET 应用程序使用 EF,连接字符串配置为使用集成安全...
<connectionStrings>
<add name="MyContext"
connectionString="metadata=res://*/Data.MyModel.csdl|res://*/Data.MyModel.ssdl|res://*/Data.MyModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=sql1.mydomain.local\sql2008r2;Initial Catalog=MyDatabase;Persist Security Info=false;Integrated Security=True;MultipleActiveResultSets=True""
providerName="System.Data.EntityClient" />
</connectionStrings>
我的 web 配置指定了 Windows 身份验证和模拟,因为我使用异步页面,所以我还启用了模拟策略流动......
<runtime>
<alwaysFlowImpersonationPolicy enabled="true" />
</runtime>
<system.web>
<authentication mode="Windows" />
<identity impersonate="true" />
</system.web>
如果我在本地登录(在“web1”上)并浏览到应用程序(使用 IE),这一切都有效 - 但这不涉及我试图解决的双跳。
如果我登录到另一台机器,然后使用 IE 浏览到应用程序,或者我使用 FireFox 从本地机器浏览,这不起作用 - 注意:FireFox 会提示我输入登录详细信息。与数据库的连接失败并显示“用户 'NT AUTHORITY\ANONYMOUS LOGON' 登录失败”
与许多文章不同(这可能是问题的一部分),我没有使用任何自定义代码来模拟用户。据我了解,模拟将通过上面的 web.config 设置全面应用于应用程序。我所做的就是打开连接,然后在完成连接后再次关闭它。
我显然错过了一个(或两个)步骤,但是查看了我能找到的所有文档(并且有很多),我仍然找不到那个步骤是什么。我能找到的 99% 的文档实际上都与 IIS6 和 Windows 2003 相关,这无济于事,但原则应该保持不变。
有没有人成功让这样的配置在 Windows 7 和/或 Windows Server 2008 上运行?