问题 ASP.NET 4.0和SQL2008R2中的Kerberos双跃点


我有一个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=&quot;Data Source=sql1.mydomain.local\sql2008r2;Initial Catalog=MyDatabase;Persist Security Info=false;Integrated Security=True;MultipleActiveResultSets=True&quot;"
             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上运行这样的配置?


12845
2017-12-04 15:44


起源

在Web和数据库服务器上启用Kerberos事件日志记录: support.microsoft.com/kb/262177?wa=wsignin1.0  事件查看器是查找和修复kerberos错误的关键。 - brian
我已启用此功能,并且还下载了网络监视器工具,但我仍然看不到足够的信息告诉我有什么问题。我想我没有正确阅读,因为我毫不怀疑答案就在那里。 - Martin Robins


答案:


双跳问题清单{IIS和SQL Server}

http://blogs.technet.com/b/taraj/archive/2009/01/29/checklist-for-double-hop-issues-iis-and-sql-server.aspx

http://www.phishthis.com/2009/10/24/how-to-configure-ad-sql-and-iis-for-two-hop-kerberos-authentication-2/

http://support.microsoft.com/kb/810572

IIS到SQL Server kerberos auth问题


7
2017-12-04 16:34



我已经看过其中的几个,现在尝试了其他的建议。唉,我仍然无法让这个工作。 - Martin Robins
IIS7中的Windows身份验证提供程序必须设置为Negotiate:Kerberos,而不是NTLM。这意味着必须禁用内核模式身份验证设置。 blog.reveille.org.uk/2010/01/asp-net-impersonation-delegation - Joe
乔;你是对的 - 我发现的任何其他文档中都没有显示“Negotiate:Kerberos” - 可能是因为AFAIK是IIS7 +的新版本,所有文档都是针对IIS6的。 - Martin Robins
我花了几天时间试图解决这个该死的DH问题。干起头来欢呼! - else


为SQL Server配置SPN时,我们发现需要包含SQL Server侦听的PORT(1433)。

您应该下载并使用Brian Booth的DelegConfig v2工具来帮助您设置正确的配置设置。 http://blogs.iis.net/brian-murphy-booth/archive/2009/04/22/delegconfig-v2-beta.aspx

在整个过程中,它基本上都会牵着你的手。我们发现这个工具非常宝贵。


6
2017-12-05 16:20



我已下载该工具。虽然它非常好,它告诉我配置是正确的,但是当我尝试访问数据库中的表时,我得到相同的登录失败消息。 - Martin Robins
我的建议是用端口1433替换SQL2008R2。 setspn -a MSSQLSvc/sql1.mydomain.local:1433 SqlServer - John Ruiz
约翰,你对SPN也是正确的;我已经命名了实例SPN,但是一旦我删除了它们并为host.fqdn:1433创建了一个SPN,这就有所帮助。 - Martin Robins
@MartinRobins我很高兴听到它。谢谢你的upvote! - John Ruiz