当SQL Server作为域帐户而不是SYSTEM或NETWORK SERVICE运行时,SQL CLR函数无法模拟

时间:2011-06-11 13:56:23

标签: .net sql-server impersonation sqlclr

我有以下代码在测试框上完美运行,该测试框以SYSTEM身份运行MSSQLSERVER服务:

      currentIdentity = SqlContext.WindowsIdentity;
      impersonatedIdentity = currentIdentity.Impersonate();

       client.PreAuthenticate = true;
       client.Credentials = CredentialCache.DefaultNetworkCredentials;
       client.Url = currentURL;

   /* Encrypt */
   try
   {
      encryptedText = client.Encrypt(plainText);
   }
   finally
    {
        if (impersonatedIdentity != null)
        {
            impersonatedIdentity.Undo();
        }
    }

        return encryptedText;

此功能的基本思想是通过内部托管的Web服务加密/解密文本。只要在运行MSSQLSERVER服务的服务器上调用此函数作为“SYSTEM”或其他本地帐户,模拟就可以正常工作。如果服务器将MSSQLSERVER服务作为域帐户运行(即DOMAIN \ sqlaccount),则“DOMAIN \ sqlaccount”的凭据将始终传递给Web服务,并且模拟似乎不起作用。

这是预期的行为吗?提前谢谢。

3 个答案:

答案 0 :(得分:2)

对于您正在运行SQL Server的服务帐户,该帐户是否已启用模拟?在活动目录中的用户的属性窗口中有一个名为delegation的选项卡。您可以选择不允许委派,允许不加区分地委派,或者配置该帐户被授权委托的服务。默认为“不信任”,这可能是您的问题。看看,看看你找到了什么。

答案 1 :(得分:1)

将加密函数调用移出SQLCLR。从SQL进行Web服务调用是一个非常非常糟糕的主意。 SQL Server资源非常珍贵,不能浪费它们等待HTTP响应,甚至是内部Intranet。我从来没有遇到过合理的解释,为什么要从SQLCLR内部进行Web服务调用,而不是短视的冷静因子。从应用程序调用Web服务,是等待HTTP响应的适当位置。

答案 2 :(得分:0)

您使用什么协议进行身份验证?

如果您使用的是Kerberos,我会期待这种行为。在Kerberos中,自动定义SYSTEM和NETWORK SERVER SPN。但是,如果要使用自定义服务名称,则需要定义SPN(用于该服务名称)以进行身份​​验证。