我有一个ASP.NET 4.0应用程序,我需要在其中将身份验证转发到数据库。 出于此请求帮助的目的,我们调用Web服务器“app1”和数据库服务器“sql1”。
SQL2008R2数据库服务作为自定义域帐户“SqlServer”下的命名实例“SQL2008R2”运行。该服务器正在运行Windows Server 2008 R2 Enterprise Edition。 我为此创建了一个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身份验证和模拟,因为我使用了异步页面,我还启用了inpersonation策略流程...
<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上运行这样的配置?