2

我们有一个系统,他们的客户希望集成Windows身份验证。 这是一个连接到Sql Server 2005的ASP.NET 3.5应用程序。 Web服务器是Server 2003 R2 SP2。 数据库服务器是Server 2003 SP2(不是R2)。ASP.NET> SqlServer;信任和委托

在DB服务器,我跑了下面的脚本

exec sp_grantlogin 'myDomain\myUserGroup' 
USE myDbName 
exec sp_grantdbaccess 'myDomain\myUserGroup' 

我有3个用户的Windows用户组 'myDomain的\ myUserGroup' 在现在。所有三个用户的帐户都被标记为可信委派。 AD中的Web服务器帐户被标记为委派代理。

该Web应用程序被标记为使用Windows身份验证(所有其他关闭)。 web.config中有下面几行:

<authentication mode="Windows" ></authentication> 
<identity impersonate="true" /> 
<authorization> 
    <deny users="?"/> 
</authorization> 

然而,当我尝试连接到与作为用户组中的用户的web应用程序,我得到的错误:

System.Data.SqlClient.SqlException: 
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'. 

我连接字符串被从构造为这样一个SQL ConnectionStringBuilder内置:

ConnectionStringBuilder.DataSource = "MYDBSERVER" 
ConnectionStringBuilder.InitialCatalog = "MYDBCATALOG" 
ConnectionStringBuilder.IntegratedSecurity = True 

如果我硬编码允许的帐户中的一个来冒充上的web.config <identity />行它的工作。但是,如果我脱掉硬编码账户并尝试从客户机传递身份。我收到错误。

因此,似乎我没有为多跳集成登录场景配置正确的东西,但我无法弄清楚什么。

在此先感谢!

回答

2

如果您使用Windows身份验证,则模拟不会流过ASP.NET进程本身。这里有两个选项 - 交换到基本身份验证,其中身份正在流动,或者,如果您在Win2003或更高版本上运行,则可以使用Kerberos和some hackery来模拟您连接时的身份

+0

那么,虽然我们可以控制客户端站点上的专用Web /数据库服务器,但我无法控制他们的域名,所以我们选择使用基本身份验证。而不是试图处理可能需要在其领域中对AD进行更改的政治问题。 切换到基本身份验证。正如你所说,登录流程非常完美,现在我们正在运行。 谢谢! – eidylon 2009-07-14 15:36:07

3

ASP计算机已验证用户连接到IIS通过NTLM/Kerberos。域控制器已经要求原始用户进程(IE)提供一个保证其身份的秘密:他在登录框时键入的密码来保证身份验证。实际上,身份验证不是由涉及的进程完成的,而是由涉及的每台计算机上的本地安全机构(LSA,又名.sass.exe)完成的。因为ASP机器上的LSA知道认证是正确的,所以它将允许模拟远程用户访问在所述LSA的控制下有权访问的任何东西(换句话说,本地ASP机器上的所有东西)。

一旦模拟用户的ASP进程再次跳到一台新机器,它已经离开了由ASP机器上的LSA控制的领域。 SQL机器上的LSA没有理由信任ASP机器上的LSA。所以它要求它提供一个证据,证明它是谁(模仿的用户)。很遗憾,ASP机器不能提供这样的证明,因为它没有用户密码(它的密码)。

解决方法是一种叫做“约束委托”的东西。通过约束委派,域控制器干预SQL机器LSA和ASP机器LSA之间的协商,并说'ASP机器正常,我为他保证'。所以SQL的机器LSA信任身份验证并认证原始的模拟用户。

的技术细节如何建立约束代表团How To: Use Protocol Transition and Constrained Delegation in ASP.NET 2.0

注意,这是真正的随时随地“双跳”和模拟参与描述,不管涉及到资源的类型(可以是SQL服务器,可以是文件共享,可以是新的后端ASP服务)。