【问题标题】:ASP.NET > SqlServer; trust and delegationASP.NET > SqlServer;信任与委托
【发布时间】:2010-11-10 11:02:55
【问题描述】:

我们有一个客户需要集成 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 &lt;identity /> 行上对允许的帐户之一进行硬编码,则它可以工作。但是,如果我取消硬编码帐户并尝试从客户端机器传递身份。我得到了错误。

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

提前致谢!

【问题讨论】:

    标签: asp.net sql-server-2005 windows-authentication integrated-security


    【解决方案1】:

    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 信任身份验证并验证原始的模拟用户。

    How To: Use Protocol Transition and Constrained Delegation in ASP.NET 2.0中描述了如何设置约束委派的技术细节

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好吧,虽然我们可以控制客户端站点上的专用 web/db 服务器,但我无法控制他们的域,因此我们选择使用基本身份验证。而不是试图处理可能需要对其域中的 AD 进行更改的政治。切换到基本身份验证。正如您所说,登录流程完美无缺,我们现在已经启动并运行。谢谢!
      • 这也解决了我的问题,非常感谢!值得注意的是,要让它工作,我不仅要打开 Basic Authentication ,还要关闭“Integrated Windows authentication”。这不适用于两个检查。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多