2

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

在数据库服务器中,我运行了以下脚本

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

我现在在 Windows 用户组“myDomain\myUserGroup”中有 3 个用户。所有三个用户的帐户都被标记为受信任的委派。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 /> 行上对允许的帐户之一进行硬编码,则它可以工作。但是,如果我取消硬编码帐户并尝试从客户端机器传递身份。我得到了错误。

所以似乎我没有为多跳集成登录场景正确配置一些东西,但我不知道是什么。

提前致谢!

4

2 回答 2

3

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

一旦模拟用户的 ASP 进程再次跳转到新机器,它就离开了由 ASP 机器上的 LSA 控制的领域。SQL 机器上的 LSA 没有理由信任 ASP 机器上的 LSA。所以它要求它提供一个证明,证明它就是它声称的那个人(假冒用户)。不幸的是,ASP 机器不能提供这样的证明,因为它没有用户密码(它的密码)。

解决方法是所谓的“约束委派”。通过约束委派,域控制器干预 SQL 机器 LSA 和 ASP 机器 LSA 之间的协商,并说“ASP 机器正常,我为他担保”。因此 SQL 的机器 LSA 信任身份验证并验证原始的模拟用户。

如何设置约束委派的技术细节在如何:在 ASP.NET 2.0 中使用协议转换和约束委派中进行了描述

请注意,只要涉及“双跳”和模拟,无论涉及的资源类型如何(可以是 SQL 服务器,可以是文件共享,可以是新的后端 ASP 服务),这都是正确的。

于 2009-07-13T22:18:38.887 回答
2

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

于 2009-07-13T21:25:42.783 回答