代码之家  ›  专栏  ›  技术社区  ›  TrueWill

在IIS中集成Windows身份验证导致ADO.NET失败

  •  1
  • TrueWill  · 技术社区  · 14 年前

    我们有.NET 3.5 Web服务( wcf)在IIS下运行。必须使用 identity impersonate="true" 和集成的Windows身份验证,以便对第三方软件进行身份验证。此外,它使用ADO.NET和SQL Server身份验证(在连接字符串中指定固定的用户ID和密码)连接到SQL Server数据库。

    在将数据库从SQL Server A移动到SQL Server B之前,所有操作都正常。(两者都与Web服务器不同。)然后Web服务将引发以下异常:

    网络相关或 发生特定于实例的错误 建立到SQL的连接 服务器。找不到服务器或 无法访问。验证 实例名正确,并且该SQL 服务器配置为允许远程 连接。(提供程序:命名管道 提供程序,错误:40-无法打开 连接到SQL Server)

    这个错误 只有 在web.config中,如果Identity Impersonate为true,则发生。

    同样,连接字符串没有更改,它指定了用户。我已经测试了连接字符串,它可以在模拟帐户和服务帐户(以及从远程计算机和服务器)下工作。

    要使其与模拟一起工作,需要更改什么?

    编辑:

    鲁萨努笔下的人头马指引了我们正确的方向。这归根结底是Kerberos-没有为新服务器设置SPN。也见 asp.net via kerberos integrated windows authentication to sql server . 谢谢您!

    4 回复  |  直到 14 年前
        1
  •  3
  •   Remus Rusanu    14 年前

    当使用模拟并访问不同主机上的资源时,会发生委派(外行称之为“两个跃点”)。由于默认情况下会限制委派,除非显式启用了受约束的委派,否则身份验证将失败。

    但是,等等,您说,我使用SQL身份验证,而SQL身份验证不是NTLM/Kerberos的“资源”。是的,我说,但你也用 命名管道 命名管道 一个NTLM/Kerberos资源,因此委派 发生。

    How to: Configure Client Protocols 以确保SQL Server正在侦听TCP和 Configuring Client Network Protocols 有关如何强制客户端选择特定协议(即不要先尝试命名管道)。您也可以通过简单地附加 tcp: 在连接字符串中的服务器名称前面。

        2
  •  0
  •   Greg Olmstead    14 年前

    您是否在Web服务本身中使用模拟?

    Web服务中的模拟操作在不同于IIS的层上进行。要从客户端获取到Web服务,您可以让identity=impersonate off并从serviceSecurityContext获取用户令牌,即使匿名模式为on。

    若要在Web服务中模拟该令牌,请从ServiceSecurityContext获取WindowsCredential,并在using语句中调用credential.impersonate()方法,将到数据库的连接置于using块中。

    public class HelloService : IHelloService
    {
        [OperationBehavior]
        public string Hello(string message)
        {
            WindowsIdentity callerWindowsIdentity =
            ServiceSecurityContext.Current.WindowsIdentity;
            if (callerWindowsIdentity == null)
            {
                throw new InvalidOperationException
               ("The caller cannot be mapped to a WindowsIdentity");
            }
            using (callerWindowsIdentity.Impersonate())
            {
                // Access a file as the caller.
            }
            return "Hello";
        }
    }
    

    此外,如果您需要流程中的另一个分支(即后端服务在另一台服务器上),则需要使用委派来传播凭证。您也可以声明地这样做。有关详细信息,请参阅本文: http://msdn.microsoft.com/en-us/library/ms730088.aspx

        3
  •  0
  •   Shiraz Bhaiji    14 年前

    因为它在SQL Server位于同一个框中时工作,所以可以连接到事务。

    可能是它试图使用msdtc,而被模拟的用户缺乏某些权限。

    您可以尝试的另一件事是使用您试图模拟的用户登录到Web服务器,然后查看是否可以连接到SQL Server。

        4
  •  0
  •   Greg Olmstead    14 年前

    如果您的问题是委派,请参阅本文以启用受约束的委派。 http://msdn.microsoft.com/en-us/library/ms730088.aspx

    转到最底层了解如何为受约束的委托设置帐户。我知道这是一篇WCF文章,但是设置帐户以使用委派的过程应该是相同的。

    更多细节,请点击这里。 http://technet.microsoft.com/en-us/library/cc739587(WS.10).aspx

    或者,让您的SQL服务器启用TCP访问并以这种方式访问它,如Remus所解释的。